C++ 整数|=字符;忽略整数中高位字节的操作

C++ 整数|=字符;忽略整数中高位字节的操作,c++,bit-manipulation,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? char*字节={0

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

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?
char*字节={0x01,0xD8};
int值=0;
值=字节[0];//结果为1(0x0001)

值在您的示例中,类型
char
相当于
signed char
,这意味着当您将值
0xD8
保存在
char
中时,它将显示为负数

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


要解决这个问题,您可以在使用二进制算术时,将所有数据类型设置为无符号。或者您可以编写
value |=((无符号字符)buffer[0])
value |=buffer[0]&0xFF
在您的情况下,类型
char
相当于
有符号字符
,这意味着当您将值
0xD8
保存在
char
中时,它将显示为负数

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


要解决这个问题,您可以在使用二进制算术时,将所有数据类型设置为无符号。或者您可以编写
值|=((无符号字符)缓冲区[0])
值|=缓冲区[0]&0xFF

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


也就是说,
D8
在or操作发生之前变成
FFD8

为了执行
=“code>操作,我们需要两侧的操作数大小相同。由于
char
小于
int
,因此必须将其转换为
int
。但是,由于
char
是一种有符号类型,因此它通过符号扩展扩展扩展为
int


也就是说,
D8
在or操作发生之前就变成了
FFD8

我想我遇到了问题,这里char是一个有符号字符(216),但有符号字符可以存储介于(-128127)之间的值,这意味着216(11011000)最高有效位是1,这是一个负数,2的补充是00101000,相当于-40

当你这么做的时候 值|=字节[1]

在这种情况下,实际上是取256,-40的或


(256 |-40)等于-40

我想我遇到了问题,这里char是一个有符号字符(216),但有符号字符可以存储介于(-128127)之间的值,这意味着216(11011000)最高有效位是1,这是一个负数,2的补充是00101000,相当于-40

当你这么做的时候 值|=字节[1]

在这种情况下,实际上是取256,-40的或


(256 |-40)等于-40

缓冲区和值的类型是什么?
缓冲区和
值的类型是什么?这个代码太“伪”了,我无法回答这个问题。@Mu-
缓冲区
是一个
字符*
是一个
int
我猜它是扩展右边值的符号(
D8
)在or操作发生之前,使两侧的操作数长度相同。切勿将有符号类型与按位运算符一起使用-问题的答案就这么简单。
缓冲区
的类型是什么?对于我来说,这段代码太“伪”了一点,无法回答问题。@Mu-
缓冲区
字符*
value
是一个
int
我猜它是在or操作发生之前扩展右边值(
D8
)的符号,以使两边的操作数长度相同。千万不要将有符号类型与位运算符一起使用-问题的答案很简单。要挑剔,整数提升使字节[1]成为保留符号的(有符号)整数。虽然它们是通常算术转换的一部分。这段代码不是我的,我不知道为什么一开始就不使用
无符号字符,但是cast很好地解决了我的问题,谢谢!需要指出的是,整数提升使字节[1]成为保留符号的(有符号)整数。虽然它们是通常算术转换的一部分。这段代码不是我的,我不知道为什么一开始就不使用
无符号字符,但是cast很好地解决了我的问题,谢谢!