整数| = Char;操作忽略Integer中的高位字节

时间:2011-09-02 06:41:14

标签: c++ bit-manipulation

这是一个快速而具体的问题,这几乎让我困扰了半个小时。

char * bytes = {0x01, 0xD8};
int value = 0;

value = bytes[0];  // result is 1 (0x0001)
value <<= 8;       // result is 256 (0x0100)
value |= bytes[1]; // result is -40? (0xFFD8) How is this even happening?

最后一个操作是我感兴趣的,它如何将256的有符号整数转换为-40?

编辑:为了简洁而更改了大部分示例代码

3 个答案:

答案 0 :(得分:2)

在您的情况下,char类型等同于signed char,这意味着当您将值0xD8保存在char时,它将显示为否定号。

|=操作期间发生的通常的算术转换是保留值的,因此保留负数。

要解决此问题,您可以在拥有二进制算术时创建所有数据类型unsigned。或者您可以撰写value |= ((unsigned char) buffer[0])value |= buffer[0] & 0xFF

答案 1 :(得分:1)

为了执行|=操作,我们需要两侧的操作数大小相同。由于char小于int,因此必须将其转换为int。但是,由于char是签名类型,因此它已扩展为符号扩展名int

也就是说,D8在操作或操作发生之前变为FFD8

答案 2 :(得分:1)

我认为我遇到了问题,这里char是一个带签名的字符(216)但是签名字符可以存储介于两者之间的值(-128,127),这意味着216(11011000)最重要的位是1,这是一个负数2的恭维是00101000,相当于-40

当你这样做的时候  value | = bytes [1];

在这种情况下,实际上你正在使用256,-40

的OR

(256 | -40)等于-40