具有无符号字符的位运算符

时间:2011-02-22 17:23:30

标签: c

unsigned char x = 93;
unsigned char a = x << 4;
printf("a = %d\n", a);

我确实理解位运算符是如何工作的,但我不理解x的二进制表示。

a = 208怎么样?

5 个答案:

答案 0 :(得分:4)

93 = 01011101

将4位移位并保留以下内容(结果中只有8位):

11010000 = 208

答案 1 :(得分:3)

x = 93 = 0x5D = 0101 1101
         << 4 = 1101 0000

1101 0000(十进制)是208。

答案 2 :(得分:1)

93 = 0x5d
0x5d << 4 = 0x5d0
0x5d0 & 0xff = 0xd0
0xd0 = 208

即。这里发生的事情是顶部的位被截断了。

答案 3 :(得分:1)

数学上它对应于以下内容:

x <4是x * 16,所以x * 16 = 93 * 16 = 1488

但是a是无符号字符(即0&lt; = a&lt; 256),所以a = 1488模256 = 208

答案 4 :(得分:0)

那是因为unsigned char只能大到255(二进制1111 1111)。如果一个数字被左移,那么超出其边界的所有位都将丢失。 0b11111111&lt;&lt; 1 = 0b11111110

所以,如果你得到93的二进制(0101 1101)并且左移4次你会得到1101 0000 - 最左边的4位永远丢失。