我对按位运算还不熟悉。我有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,移位负ints是实现定义的,但是您的实现似乎与大多数实现一样,并将其移位,就好像它是一个unsigned位模式,所以左移位8位等于乘256。
printf( "%d, %x\n", shifted, shifted );
  -256, ffffff00

如预期。二进制补码中-256的位模式是0xFFFFFF00(32位ints)。
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/

10-09 16:36