[英]Why does bit shifting with equal sign prints out different result opposed to non-equal case?
為什么 01 和 02 大小寫不同?
char c=0xAB;
printf("01:%x\n", c<<2); // fffffeac
printf("02:%x\n", c<<=2); //ffffffac
printf("03:%x\n", c<<=2);
隱式促銷。
您在一個使用二進制補碼以本機機器格式表示數據的系統上, char
已簽名並具有 8 位,而int
在您的機器上具有 32 位。
c<<2
中的c
和2
被隱式提升為int
,因此它變為(int)c << (int)2
。 c
是0xAB
, (int)c
符號擴展為 32 位,所以它是0xffffffab
。 然后<<2
發生,因此結果值為0xfffffeac
。
c <<= 2
c
0xfffffeac
,然后整個表達式的值在賦值后變成c
的值。 因此, c << 2
為(int)0xfffffeac
0xffffeac 的結果在分配給c
時被轉換為char
。 因為char
在您的機器上有 8 位,所以該值被截斷為 8 位,並且c
等於0xac
。 再一次, 默認參數提升發生在變量參數 function 調用中作為變量參數列表一部分的每個參數,如printf(const char *, ...);
- ..
之后的每個參數都經過默認參數提升。 那么c
現在等於0xac
再次符號擴展到 32 位到int
,所以變成0xffffffac
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.