ما قيمة −5 بالمتمم الثنائي عند ثمانية بتات؟
11111011 هي 11111011، أي 0xFB بالست عشري.
اكتب عدداً صحيحاً ذا إشارة لتحصل دفعة واحدة على الإشارة والمقدار والمتمم الأحادي والمتمم الثنائي والثنائي المزاح، بعرض 4 إلى 64 بت. أو الصق نمط بتات أو بايتاً ست عشرياً لترى قراءاته الخمس جنباً إلى جنب. محلي ومجاني وبلا تسجيل.
اكتب عدداً صحيحاً ذا إشارة. تُحسب التمثيلات الأربعة دفعة واحدة — لست مضطراً أن تعرف مسبقاً أيها يستعمله نظامك.
| الترميز | البتات | ست عشري |
|---|---|---|
| الإشارة والمقدار | 1000 0101 | 85 |
| المتمم الأحادي | 1111 1010 | FA |
| المتمم الثنائي | 1111 1011 | FB |
| الثنائي المزاح | 0111 1011 | 7B |
ينفق كل من الإشارة والمقدار والمتمم الأحادي نمط بتات واحداً على الصفر السالب، فيسعان قيمة أقل من المتمم الثنائي ولا يبلغان أصغر عدد سالب.
وجدت بايتاً في تفريغ ذاكرة أو في مسجّل ولا تعرف كيف يُفترض أن يُقرأ. الصقه هنا لترى معناه تحت كل تأويل دفعة واحدة — وأيها الصحيح يتوقف على النظام الذي أنتجه، ولذلك تُعرض كلها.
| يُقرأ على أنه | القيمة |
|---|---|
| بلا إشارة | 251 |
| الإشارة والمقدار | -123 |
| المتمم الأحادي | -4 |
| المتمم الثنائي | -5 |
| الثنائي المزاح | 123 |
محسوب بالمحرّك نفسه الذي تستعمله الأداة أعلاه، فلا يمكن أن تفترق هذه القيم عنها.
| عشري | الإشارة والمقدار | المتمم الأحادي | المتمم الثنائي | الثنائي المزاح | ست عشري |
|---|---|---|---|---|---|
| 127 | 0111 1111 | 0111 1111 | 0111 1111 | 1111 1111 | 7F |
| 100 | 0110 0100 | 0110 0100 | 0110 0100 | 1110 0100 | 64 |
| 10 | 0000 1010 | 0000 1010 | 0000 1010 | 1000 1010 | 0A |
| 5 | 0000 0101 | 0000 0101 | 0000 0101 | 1000 0101 | 05 |
| 1 | 0000 0001 | 0000 0001 | 0000 0001 | 1000 0001 | 01 |
| 0 | 0000 0000 | 0000 0000 | 0000 0000 | 1000 0000 | 00 |
| -1 | 1000 0001 | 1111 1110 | 1111 1111 | 0111 1111 | FF |
| -5 | 1000 0101 | 1111 1010 | 1111 1011 | 0111 1011 | FB |
| -10 | 1000 1010 | 1111 0101 | 1111 0110 | 0111 0110 | F6 |
| -100 | 1110 0100 | 1001 1011 | 1001 1100 | 0001 1100 | 9C |
| -127 | 1111 1111 | 1000 0000 | 1000 0001 | 0000 0001 | 81 |
| -128 | — | — | 1000 0000 | 0000 0000 | 80 |
| العرض | المتمم الثنائي / الثنائي المزاح | الإشارة والمقدار / المتمم الأحادي |
|---|---|---|
| 4 | -8 … 7 | -7 … 7 |
| 8 | -128 … 127 | -127 … 127 |
| 16 | -32768 … 32767 | -32767 … 32767 |
| 32 | -2147483648 … 2147483647 | -2147483647 … 2147483647 |
| 64 | -9223372036854775808 … 9223372036854775807 | -9223372036854775807 … 9223372036854775807 |
بناه وتحقّق منه فريق هندسة Go Tools.
11111011 هي 11111011، أي 0xFB بالست عشري.
−128 … 127 من −128 إلى 127 في المتمم الثنائي؛ ومن −127 إلى 127 في الإشارة والمقدار والمتمم الأحادي.
القيمة − 2^n إن كان أعلى بت 0 فاقرأه بلا إشارة؛ وإن كان 1 فاطرح 2^n من القراءة بلا إشارة.
−1 أو 255 هي −1 كبايت ذي إشارة، و255 كبايت بلا إشارة. والبتات وحدها لا تحسم الأمر.
يجيب المتمم الثنائي عن سؤال في العتاد لا عن سؤال رياضي: كيف تخزّن الأعداد السالبة بحيث يظل جامع الأعداد الذي بنيته أصلاً صالحاً للعمل؟ الحيلة أن يُمثَّل −x بالنمط الموافق لـ 2^n − x. عندئذ يلتف الجمع حول المقياس 2^n ويقع على الجواب الصحيح بلا أي حالة خاصة للإشارات، ولهذا لا يحتاج الطرح إلى دائرة مستقلة.
ويتبع ذلك أثران يظهران في أخطاء برمجية حقيقية. الأول أن المدى غير متماثل: ثمانية بتات تغطي من −128 إلى 127 لا إلى 128، لأن الأنماط محدودة العدد ويجب توزيعها، وليس ثمة صفر سالب يعدّل الكفّتين. والثاني أن الإشارة ليست راية يمكن نزعها — أعلى بت في 11111011 يساوي 1، لكن القيمة −5 لا −123، فقراءة العدد السالب تعني تأويل الكلمة كاملة لا النظر إلى بت واحد.
أما الإشارة والمقدار والمتمم الأحادي فهما التصميمان اللذان خسرا المنافسة. ويظلان جديرين بالمعرفة لأن الفاصلة العائمة في IEEE 754 أبقت على تخطيط الإشارة والمقدار، ولأن المقارنة بينها هي ما يجعل المتمم الثنائي يبدو حتمياً لا اعتباطياً.
// -5 as an 8-bit byte, three ways to arrive at the same pattern 0b00000101 // 5 ~0b00000101 // 11111010 ones' complement of 5 ~0b00000101 + 1 // 11111011 two's complement = -5 // In JavaScript the width matters: bitwise operators are 32-bit, // so anything wider has to go through BigInt. BigInt.asIntN(8, 0xFBn) // -5n BigInt.asUintN(8, -5n) // 251n BigInt.asIntN(64, 0xFFFFFFFFFFFFFFFBn) // -5n // C23 made two's complement mandatory for signed integers. // Before that, the other two encodings were legal but unused.
تُحسب الإشارة والمقدار والمتمم الأحادي والمتمم الثنائي والثنائي المزاح معاً. والثنائي المزاح هو ما تغفله أكثر الحاسبات، وهو نفسه الذي تواصل صحائف بيانات محوّلات ADC استعماله.
الصق البتات أو القيمة الست عشرية التي بين يديك فعلاً وشاهد القراءات الخمس كلها، بما فيها القراءة بلا إشارة. وهذا هو الاتجاه الذي تحتاجه حين يخالف التفريغُ الرقمَ الذي يعلنه الجهاز.
تُعالَج كل قيمة بـ BigInt، فتنحلّ 0xFFFFFFFFFFFFFF9C إلى −100 لا إلى ما ينتج عن اقتطاع إلى 32 بت.
عند العرض 8 بت لا تملك القيمة −128 صيغة في الإشارة والمقدار ولا في المتمم الأحادي. والجدول يقول ذلك بدل أن يطبع نمطاً لا يعني هذا العدد.
أدخل 0 فيظهر لك النمط الثاني للصفر في الإشارة والمقدار وفي المتمم الأحادي، وهو أوضح حجة مفردة على سبب انتصار المتمم الثنائي.
يُبنى جدول المقارنة بعرض 8 بت وجدول المديات لكل عرض وقت بناء الصفحة، بالمحرّك نفسه الذي يشغّل الحقول الحيّة، فلا يمكن أن يفترقا عنه.
BigInt.asIntN، وint.from_bytes(..., signed=True) في Python، والأنواع ثابتة العرض في لغة سي، تعطي الجواب المعتمد للشفرة التي تكتبها. استعملها داخل الشفرة، واستعمل هذه الصفحة حين تكون أمامك قيمة ولا مفسّر مفتوح.
يعرض القيمة بالنوع الذي أعلنه البرنامج، وهو بالضبط ما تفتقر إليه سلسلة البتات وحدها. لكنه لا يفيد حين تصل البايتات عبر سلك بلا نوع معلن — وتلك هي الحالة التي وُجدت لها هذه الصفحة.
يحوّل بين الأنظمة العددية، لكن للقيم غير السالبة فقط — إذ تُرفض السوالب هناك صراحةً لأن «النظام العددي» لا رأي له في كيفية تخزين الإشارة. فالتمثيل ذو الإشارة شأن هذه الصفحة، ومحوّل الأنظمة للمقادير.
هو النظير في عالم الفاصلة العائمة. يحتفظ بتخطيط الإشارة والمقدار بدل المتمم الثنائي، ويحيّز الأس بمقدار 2^(e−1)−1، فالصفحتان تجيبان عن سؤالين مختلفين عن الكلمة نفسها في الذاكرة.
-5، العرض 8
الإشارة والمقدار 1000 0101 المتمم الأحادي 1111 1010 المتمم الثنائي 1111 1011 (0xFB) الثنائي المزاح 0111 1011
تتفق الترميزات الثلاثة على بت الإشارة وتختلف في كل ما عداه. والصف الوحيد الذي يمثّل ما يخزّنه فعلاً النوع int8_t في لغة سي هو صف المتمم الثنائي.
0xFB، العرض 8
بلا إشارة 251 الإشارة والمقدار -123 المتمم الأحادي -4 المتمم الثنائي -5 الثنائي المزاح 123
-128، العرض 8
الإشارة والمقدار لا تمثيل لها المتمم الأحادي لا تمثيل لها المتمم الثنائي 1000 0000 (0x80) الثنائي المزاح 0000 0000
ينفق كل من الإشارة والمقدار والمتمم الأحادي نمط بتات على الصفر السالب، فيمتد مدى كل منهما من −127 إلى 127 ولا يبلغ −128. والأدوات التي تطبع نمطاً هنا مخطئة.
0xFFFFFFFFFFFFFF9C، العرض 64
المتمم الثنائي -100 بلا إشارة 18446744073709551516
كل ما يزيد عرضه على 32 بت يجب أن يُحسب بـ BigInt. فالعوامل | و<< و>>> في JavaScript تقتطع إلى 32 بت بصمت، وهذا سبب إعطاء بعض الحاسبات على الإنترنت جواباً خاطئاً هنا بدل أن تُعلن خطأً.
الخيارات هي 4 أو 8 أو 16 أو 32 أو 64. وهذا ليس تفضيلاً في العرض — فالنمط نفسه يعني أعداداً مختلفة باختلاف العرض، وخطأ اختياره يغيّر الجواب.
اكتب عدداً صحيحاً مع إشارة السالب إن وُجدت. تتحدّث الترميزات الأربعة أثناء الكتابة، ومعها الصيغة الست عشرية لكل منها.
الصق سلسلة ثنائية أو قيمة تبدأ بـ 0x في حقل القراءة العكسية لترى ما يعنيه هذا النمط بعينه تحت كل تأويل، بما في ذلك القراءة بلا إشارة.
تُنبّه الصفحة إلى الحالتين اللتين تُوقعان الناس: أصغر قيمة سالبة لا تمثيل لها في الإشارة والمقدار ولا في المتمم الأحادي، والصفر له نمط بتات ثانٍ في هذين الترميزين.
قلب البتات يعطي المتمم الأحادي. والتوقف عند هذه الخطوة يخالف المتمم الثنائي بمقدار واحد، والخطأ يسهل أن يمرّ لأن الناتج يظل شبيهاً بعدد سالب معقول.
5 = 00000101 ~5 = 11111010 <- ones' complement, not -5
5 = 00000101 ~5 = 11111010 ~5 + 1 = 11111011 <- -5 in two's complement
تقتطع JavaScript معاملات عوامل البتات إلى 32 بت. فيختفي النصف الأعلى بلا خطأ، وتكون النتيجة خاطئة لا غائبة.
0xFFFFFFFFFFFFFFFB // 18446744073709552000 -- the literal is already rounded ~0xFFFFFFFFFFFFFFFB + 1 // 0 -- silently wrong, expected -5
BigInt.asIntN(64, 0xFFFFFFFFFFFFFFFBn) // -5n
التوسيع بحشو الأصفار يحفظ العدد فقط حين يكون موجباً. أما القيمة السالبة فيجب تكرار بت الإشارة عبر البتات الجديدة.
int8 0xFB (-5) int16 0x00FB (251) <- zero-extended
int8 0xFB (-5) int16 0xFFFB (-5) <- sign-extended
لا تملك −128 تمثيلاً في الإشارة والمقدار ولا في المتمم الأحادي بثمانية بتات، لأن كلا الترميزين ينفق نمطاً على الصفر السالب. وطباعة 10000000 لها خلطٌ بين جواب المتمم الثنائي وترميز عاجز أصلاً عن التعبير عن هذا العدد.
-128 sign-magnitude: 10000000 <- that pattern means -0
-128 sign-magnitude: no representation at width 8 -128 two's complement: 10000000
0xFF9C. قراءتها بلا إشارة هي 65436 وهي ليست حرارة. وبعرض 16 بت يعطي صف المتمم الثنائي −100، ومع معامل مقياس قدره 0.1 درجة مئوية يكون الحسّاس يخبرك أن الحرارة −10.0 درجة مئوية.n−1 هي المقدار يُقرأ كعدد عادي بلا إشارة. والمدى من −(2^(n−1)−1) إلى 2^(n−1)−1، متماثل، وفيه صفران. وهو التخطيط الذي تستعمله IEEE 754 للفاصلة العائمة.2^n − 1 − x. المدى نفسه والصفران نفساهما كما في الإشارة والمقدار. ويحتاج الجمع إلى محمول دوّار (end-around carry)، وهو بالضبط التعقيد الذي يزيله المتمم الثنائي. والتسمية ليست اعتباطاً: المتمم الأحادي منسوب إلى كلمة كلها آحاد، بينما المتمم الثنائي منسوب إلى قوة واحدة للعدد اثنين.−x تُخزَّن على صورة 2^n − x. والمدى من −2^(n−1) إلى 2^(n−1)−1، غير متماثل عن قصد، وفيه صفر واحد. والجمع والطرح وضرب الكلمة الدنيا كلها لا تبالي بالإشارة، وهذا هو سبب انتصاره كله.2^(n−1)، فتصير −2^(n−1) أصفاراً كلها وتترتب الأنماط بالترتيب نفسه الذي ترتَّب به القيم التي ترمز إليها. وهو يساوي نمط المتمم الثنائي مع قلب أعلى بت. واحذر التسمية: حقول الأس في IEEE 754 متحيّزة بمقدار 2^(e−1)−1، أي أقل بواحد من الإزاحة المستعملة هنا.& و| و~ والإزاحات إلى أعداد صحيحة بعرض 32 بت قبل العملية ثم تعيدها بعدها، فتفقد قيمة 64 بت نصفها الأعلى دون أن يُعلَن أي خطأ. أما كل تحويل في هذه الصفحة فيجري على أعداد صحيحة غير محدودة الدقة، ولهذا تخرج أطراف مدى 64 بت مضبوطة.−(−128) مساوياً −128 في البايت ذي الإشارة. وأي شفرة تحسب القيمة المطلقة تحتاج خطة لهذا الدخل، وأي مجموعة اختبارات ينبغي أن تتضمنه.0xFB من ثمانية بتات إلى حقل بعرض 16 بت على صورة 0x00FB يحوّل −5 إلى 251. وتوسيع قيمة ذات إشارة يعني تكرار بت الإشارة، فيكون الناتج 0xFFFB.BigInt.asIntN في JavaScript، وint.from_bytes(..., signed=True) في Python، والأنواع ثابتة العرض في لغة سي، كلها تقول ما تعنيه وتتكفّل بالحالات الطرفية. أما ~x + 1 المكتوب باليد فهو مصدر أخطاء العرض.2^n − x، وهو ما يجعل الطرح والجمع دائرة واحدة، ويترك على خط الأعداد صفراً واحداً لا غير. 00000101 ثم 11111010 ثم 11111011. وخطوة القلب وحدها تعطيك المتمم الأحادي، ولهذا يفترق الاثنان دائماً بمقدار واحد. n من البتات يغطي المدى من −2^(n−1) إلى 2^(n−1)−1، إذ لا يهدر نمطاً على الصفر السالب كما تفعل الإشارة والمقدار والمتمم الأحادي، والخانة الزائدة تقع في الجهة السالبة. int8_t أو uint8_t عندك. 2^(n−1)، فتصير أصغر قيمة أصفاراً كلها، ويوافق ترتيبُ الأنماط الخام كأعداد بلا إشارة ترتيبَ القيم ذات الإشارة. تجده في مخارج محوّلات ADC وDAC وفي صيغ عيّنات الصوت. وانتبه إلى أن حقول الأس في IEEE 754 تستعمل تحيّزاً مختلفاً — 2^(e−1)−1 لا 2^(e−1) — فلا تنقل الرقم من أحدهما إلى الآخر. 65436 بينما يقصد الجهاز قيمة المتمم الثنائي −100. الصق 65436 بصيغتها الست عشرية 0xFF9C بعرض 16 هنا، فيعطيك صف المتمم الثنائي القراءة المقصودة. ~x + 1 تفقد بصمت النصف الأعلى من قيمة 64 بت وتعرض نتيجة معقولة الشكل لكنها خاطئة. أما هذه الأداة فتستعمل BigInt في كل خطوة، ولهذا تطابق صفوف الـ 64 بت هنا ما يعرضه منقّح الأخطاء عندك. 00000000 و10000000 صفراً؛ وفي المتمم الأحادي هما 00000000 و11111111. فقد تتساوى كميّتان قيمةً وتختلفان بتاً ببت عند المقارنة. أما المتمم الثنائي فله صفر واحد، وهذا وحده أزال صنفاً كاملاً من الحالات الخاصة في العتاد. أدوات التحويل
حوّل بين الأنظمة الثنائية والست عشرية والعشرية والثمانية وأي أساس من 2 إلى 36 فوراً — أداة مجانية أونلاين تعمل في متصفّحك. جرّبها الآن.
أدوات التحويل
حوّل صلاحيات ملفات لينكس بين النظام الثماني (755، 644) ورموز rwx. احصل على أوامر chmod جاهزة للتشغيل، واكشف الإعدادات الخطرة مثل 777 — مجاناً وداخل متصفحك مباشرة.
أدوات التحويل
حوّل ألوان HEX إلى RGB و HSL و OKLCH و OKLAB و CMYK داخل متصفحك — انسخ أي صيغة بنقرة واحدة. مجاني، بلا تسجيل، ألوانك لا تغادر الصفحة أبداً.
أدوات التحويل
حوّل ألوان HEX إلى CMYK في المتصفح. تقريب ساذج قائم على sRGB لمعاينات الطباعة. مجاني، بلا تسجيل، ألوانك تبقى محلياً.
أدوات التحويل
حوّل أي لون HEX إلى HSL في المتصفح — يدعم 3 و6 و8 أرقام مع alpha. مجاني، فوري، بلا تسجيل، ألوانك لا تغادر الصفحة أبداً.
أدوات التحويل
حوّل HEX إلى OKLCH لرموز تصميم Tailwind v4. إخراج موحّد إدراكياً حيّ مع تنبيهات نطاق Display P3. مجاني، في المتصفح فقط.