لماذا جافا قادرة على تخزين 0xff000000 باعتباره الباحث؟

StackOverflow https://stackoverflow.com/questions/319199

  •  11-07-2019
  •  | 
  •  

سؤال

وقيمة عدد صحيح ماكس في جاوة هو 2147483647، حيث يتم توقيع صحيحة جافا، أليس كذلك؟

و0xff000000 له قيمة رقمية من 4278190080.

ولكن أرى جافا البرمجية مثل هذا:

int ALPHA_MASK = 0xff000000;

ويمكن لأي شخص أن ينير لي من فضلك؟

هل كانت مفيدة؟

المحلول

وبت عالية قليلا علامة. وضع فإنه يدل رقما سالبا: -16777216.

وجافا، مثل معظم اللغات، وقعت مخازن الأرقام في شكل مكمل 2 ل. في هذه الحالة، طرح 2 <سوب> 31 ، أو 2147483648 من 0x7F000000، أو 2130706432، والمحاصيل -16777216.

نصائح أخرى

وفقط إضافة إلى الإجابة إريكسون ل:

وكما قال، يتم تخزين الأعداد الصحيحة وقعت كما يكمل اثنين إلى قيمة إيجابية في كل منها على معظم أبنية الكمبيوتر.

وهذا هو، يتم تقسيم كله 2 ^ 32 القيم الممكنة تصل إلى مجموعتين: واحدة للقيم الإيجابية بدءا من 0 بت واحد للقيم السالبة بدءا من 1

والآن، تخيل أننا تقتصر على أرقام 3-بت. دعونا ترتيبها بشكل مضحك التي سوف يكون له معنى في الثانية:

     000
  111   001 
110       010
  101   011  
     100  

وترى أن جميع الأرقام على الجانب الأيسر تبدأ مع 1 بت بينما على الجانب الأيمن أنها تبدأ مع 0. وقرار سابق جهدنا لتعلن السابق كما سلبية وهذه الأخيرة بأنها إيجابية، ونحن نرى أن 001، 010 و 011 هي الأرقام الإيجابية الوحيدة الممكنة في حين 111 و 110 و 101 ونظرائهم السلبية لكل منهما.

والآن ماذا نفعل مع رقمين التي هي في أعلى وأسفل، على التوالي؟ يجب أن يكون 000 الصفر، من الواضح، و 100 ستكون أقل عدد السلبي للجميع والتي لايوجد نظيره إيجابي. لتلخيص:

     000      (0)
  111   001   (-1 / 1)
110       010 (-2 / 2)
  101   011   (-3 / 3)
     100      (-4)

وقد تلاحظ أن تتمكن من الحصول على نمط قليلا من -1 (111) بانكار 1 (001) وإضافة 1 (001) إلى أنه: 001 (= 1) -> 110 + 001 -> 111 (= -1)

وبالعودة إلى سؤالك:

و0xff000000 = 1111 0000 0000 1111 0000 0000 0000 0000

ونحن لم يكن لديك لإضافة مزيد من الأصفار أمامه كما وصلنا بالفعل أقصى 32 بت. أيضا، فإنه من الواضح أن رقم سالب (كما انها بدءا من 1 بت)، لذلك نحن ذاهبون الآن لحساب القيمة المطلقة / نظيرتها إيجابي:

وهذا يعني، أننا سنأخذ اثنين الخاص تتمة ل

1111 1111 0000 0000 0000 0000 0000 0000

والذي هو

0000 0000 1111 1111 1111 1111 1111 1111

وبعد ذلك نضيف

0000 0000 0000 0000 0000 0000 0000 0001

ووالحصول على

0000 0001 0000 0000 0000 0000 0000 0000 = 16777216

لذلك، 0xff000000 = -16777216.

وشيء ربما تجدر الإشارة إلى - وليس المقصود هذا الرمز إلى أن تستخدم كعدد مع قيمة رقمية. والغرض من ذلك هو بمثابة قناع بت لتصفية قناة ألفا من قيمة لون 32 بت. هذا المتغير حقا لا ينبغي حتى اعتبار عدد، تماما كما قناع ثنائي مع ارتفاع 8 بت قيد التشغيل.

وبت إضافي للعلامة

[إينتس] جافا هي متمم ثنائي

وقعت

[إينتس] في جاوة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top