好的,让我详细解释一下发生了什么。任何需要澄清的二进制符号都将以 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 逻辑,你通常应该使用前面提到的无符号类型。