这是一个快速而具体的问题,这几乎让我困扰了半个小时。
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?
编辑:为了简洁而更改了大部分示例代码
答案 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