为什么C/C++按位XOR运算符关心符号?

Jos*_*ino 4 c++ bit-manipulation bitwise-operators bitwise-or

一段时间以来,我一直在努力处理一些低级别的消息,结果证明校验和计算存在问题.我认为按位XOR运算符不关心符号,所以我使用a QByteArray来存储字节,并使用at返回a 的方法char来计算校验和.这些消息有时被正确承认,但并非总是如此.

看起来另一端的人uint8_t用来存储字节,并且校验和在某些情况下失败了.我通过铸造char来解决它uint8_t,但我对此感到困惑.

为什么按位XOR运算符关心符号?不管他们代表什么,我认为它在某种程度上有效.这是我用来试图理解它的一段代码.

#include <stdio.h>
#include <stdint.h>
#include <iostream>
#include <bitset>

int main ()
{    
    uint8_t a = 0b10010101;
    char b    = 0b10010101;

    uint32_t checksum;

    checksum = 55;
    checksum ^= a;
    std::cout << std::bitset<32>(checksum) << std::endl;

    checksum = 55;
    checksum ^= b;
    std::cout << std::bitset<32>(checksum) << std::endl;    
}
Run Code Online (Sandbox Code Playgroud)

即使两个整数都保持相同的位,操作在每种情况下产生不同的结果.

Som*_*ude 9

首先,您必须记住,如果char已签名或未签名,则它是实现定义的.

然后,你要记住,较小的类型,如值char或者uint8_t提拔int(或可能unsigned int)在表达式中使用时.此促销带来签名类型的签名扩展.

因此,如果char已签名,则值0b10010101将被提升为0b11111111111111111111111110010101(使用负数的二进制补码).这与无符号值非常不同0b00000000000000000000000010010101.