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