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

时间:2018-09-17 10:41:23

标签: c++ bit-manipulation bitwise-operators bitwise-or

我已经在一些低级消息上苦苦挣扎了很长时间,事实证明这是校验和计算的问题。我认为按位XOR运算符不在乎符号,因此我使用QByteArray存储字节,并使用at方法返回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;    
}

即使两个整数都持有相同的位,在每种情况下,该运算也会得出不同的结果。

1 个答案:

答案 0 :(得分:9)

首先,您必须记住,char是有符号的还是无符号的,都是实现定义的。

然后,您必须记住,在表达式中使用较小类型的值(如charuint8_t时,其值是promotedint(或可能是unsigned int) 。此促销带有已签名类型的符号扩展

因此,如果对char进行了签名,则值0b10010101将被提升为0b11111111111111111111111110010101(使用two's complement表示负数)。 非常与无符号值0b00000000000000000000000010010101不同。