سؤال

هل يمكن لأي شخص أن يفسر لي لماذا لا يتحول القناع إلى اليمين على الإطلاق؟ يمكنك استخدام أي شيء بدلا من ذلك 1 والنتيجة ستكون هي نفسها.

unsigned mask = ~0 >> 1;
printf("%u\n", mask);
هل كانت مفيدة؟

المحلول

إنها مشكلة من النوع. إذا قمت بإزالة 0 إلى غير موقعة، فستكون على ما يرام:

unsigned mask = ~ (unsigned) 0 >> 1;
printf("%u\n", mask);

تحرير لكل تعليقات: أو استخدام الترميز الحرفي غير الموحد، وهو أكثر إيجازا بكثير. :)

unsigned mask = ~0u >> 1;
printf("%u\n", mask);

نصائح أخرى

علامة التمديد

ما يحدث هو ~0 هو int مع جميع مجموعات البتات (-1). الآن أنت التحول الصحيح 1; ؛ منذ ل -1, ، يمنع امتداد التوقيع على مجموعة كبيرة بحيث ظل موقع (هذا ليس ما كنت تتوقعه). ثم يتم تحويلها إلى غير موقعة كما تتوقع.

جرب هذا:

unsigned mask = (unsigned) ~0 >> 1;
printf("%08x\n", mask);

يتم التعامل مع RHS من المهمة ككمية موقعة إلا إذا قمت بإلقاء ذلك، مما يعني أنك ترى تمديد علامة دون الوضوح. (قمت أيضا بتغيير بيان الطباعة الخاص بك لعرض الرقم في Hex، وهو أسهل بالنسبة لي فك التشفير.)

~ 0 هي سلسلة من تلك. يقوم المشغل >> في تحولاتهم، وفي قيمة موقعة، فإنها تتحول تلك الموجودة في البتات ذات الترتيب العالي. لذلك يمكنك تحويل كل ما تريده، لن تتغير النتيجة.

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