unsigned char x = 93;
unsigned char a = x << 4;
printf("a = %d\n", a);
我明白位操作符如何工作,但我不明白x的二進制表示。位操作符與無符號字符
a = 208是怎樣的?
unsigned char x = 93;
unsigned char a = x << 4;
printf("a = %d\n", a);
我明白位操作符如何工作,但我不明白x的二進制表示。位操作符與無符號字符
a = 208是怎樣的?
93 = 01011101
移位留下4位,它留下以下(只有8位在結果):
11010000 = 208
x = 93 = 0x5D = 0101 1101
<< 4 = 1101 0000
1101 0000以十進制爲208
這是因爲無符號字符只能是255(1111 1111二進制)。如果一個數字是左移的,那麼所有超出邊界的數據都會丟失。 0b11111111 < < 1 = 0b11111110
所以,如果你在二進制(0101 1101)和左移得到93這4次,你會得到1101 0000 -The 4最左邊位永遠失去了。
93 = 0x5d
0x5d << 4 = 0x5d0
0x5d0 & 0xff = 0xd0
0xd0 = 208
即本案的情況是頂位已被切斷。
在數學上它對應於以下:
X < < 4爲x * 16,所以X * 16 = 93 * 16 = 1488
但a是一個無符號的字符(即,0 < =一< 256),所以a = 1488模256 = 208
`signed char`或`char`也包含8位? – foo 2011-02-22 17:37:01
@mateo:是的,都是8位。 – 2011-02-22 17:38:05