我对按位运算还不熟悉。我有AND、OR、XOR和2s补码的基本概念。然而,我遇到了下面的一段代码,无法计算出输出。
char c1 = 0xFF; // -1
int shifted = c1 << 8; //-256 (-1 * 256)
printf("%d, %x\n", shifted, shifted);
int myInt;
myInt = 0xFFFFFFE2;
printf("%d\n", myInt);
int i = 0xff;
printf("%d\n", i<<2);
输出为:
-256,法国法郎
-30个
一千零二十
请帮助我了解这里发生了什么!
最佳答案
char c1 = 0xFF; // -1
int shifted = c1 << 8; //-256 (-1 * 256)
c1
对于移位被提升为int
,所以它仍然是-1,移位负int
s是实现定义的,但是您的实现似乎与大多数实现一样,并将其移位,就好像它是一个unsigned
位模式,所以左移位8位等于乘256。printf( "%d, %x\n", shifted, shifted );
-256, ffffff00
如预期。二进制补码中-256的位模式是
0xFFFFFF00
(32位int
s)。int myInt;
myInt = 0xFFFFFFE2;
二进制位的补码是-30
printf("%d\n",myInt);
int i = 0xff ;
这是255,255*4=1020
printf("%d\n", i<<2);
-30
1020
关于c - C中的按位运算,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10254433/