0

我是按位运算的新手。我有 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, ffffff00
-30
1020

请帮助我了解这里发生了什么!

4

3 回答 3

2
char c1 = 0xFF; // -1
int shifted = c1 << 8; //-256 (-1 * 256)

c1被提升为int移位,所以它仍然是 -1,移位负ints 是实现定义的,但您的实现似乎做的最像大多数并将它移位,就好像它是一个unsigned位模式,所以左移八个位置是乘以 256。

printf( "%d, %x\n", shifted, shifted );
  -256, ffffff00

正如预期的那样。二进制补码中的 -256 的位模式是0xFFFFFF00(32-bit ints)。

int myInt;
myInt = 0xFFFFFFE2;

该位模式在二进制补码中为 -30

printf("%d\n",myInt);

int i = 0xff ;

这是 255, 255*4 = 1020

printf("%d\n", i<<2);

  -30
  1020
于 2012-04-20T22:47:47.453 回答
1

用声明的位数以二进制形式记下 c1、myInt 和 i。

将操作应用于它们。

跟着它走。

于 2012-04-20T22:52:01.843 回答
1

好的,让我详细解释一下发生了什么。任何需要澄清的二进制符号都将以 0b 和左侧的最高有效位为前缀。

char c1 = 0xFF; // -1

char c1 是八位有符号整数类型,设置为0b11111111 对于int、short、char等有符号类型,最左边的位作为符号位。在二进制补码(存储有符号类型的最常见标准)中,任何所有位设置的有符号整数都等于 -1。

int shifted = c1 << 8; //-256 (-1 * 256)

c1 在移位之前被隐式转换为有符号整数,因此我们有一个 -1 的 int,即0xffffffff. C 中的移位运算符是非旋转移位,即任何从值“移出”的位都将设置为零。移位后我们有0xffffff00,等于二进制补码中的 -256。

printf( "%d, %x\n", shifted, shifted );

int myInt;
myInt = 0xFFFFFFE2;
printf("%d\n",myInt);

您正在读取根据二进制补码打印的有符号整数。

int i = 0xff ;
printf("%d\n", i<<2);

初始 i 等价于0b11111111,符号位未设置。移位后我们有0b1111111100,等于 1020,同样是因为非旋转移位。希望能澄清一点。如果你想做位移和 AND/OR 逻辑,你通常应该使用前面提到的无符号类型。

于 2012-04-20T23:06:39.107 回答