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很好地解决了我的问题,谢谢!