2011-02-22 115 views
2
unsigned char x = 93; 
unsigned char a = x << 4; 
printf("a = %d\n", a); 

我明白位操作符如何工作,但我不明白x的二进制表示。位操作符与无符号字符

a = 208是怎样的?

回答

4
93 = 01011101 

移位留下4位,它留下以下(只有8位在结果):

11010000 = 208 
+0

`signed char`或`char`也包含8位? – foo 2011-02-22 17:37:01

+0

@mateo:是的,都是8位。 – 2011-02-22 17:38:05

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

1101 0000以十进制为208

0

这是因为无符号字符只能是255(1111 1111二进制)。如果一个数字是左移的,那么所有超出边界的数据都会丢失。 0b11111111 < < 1 = 0b11111110

所以,如果你在二进制(0101 1101)和左移得到93这4次,你会得到1101 0000 -The 4最左边位永远失去了。

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

即本案的情况是顶位已被切断。

1

在数学上它对应于以下:

X < < 4为x * 16,所以X * 16 = 93 * 16 = 1488

但a是一个无符号的字符(即,0 < =一< 256),所以a = 1488模256 = 208