代码之家  ›  专栏  ›  技术社区  ›  José Tomás Tocino

为什么C/C++位异或算子关心符号?[副本]

  •  4
  • José Tomás Tocino  · 技术社区  · 8 年前

    QByteArray 存储字节,并使用 at char ,以计算校验和。这些信息有时得到了正确的确认,但并非总是如此。

    看起来那边的人在用 uint8_t 存储字节,以及 在某些情况下校验和失败。我通过铸造 烧焦 到 单位8\t ,但我对此感到非常困惑。

    #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 回复  |  直到 8 年前
        1
  •  9
  •   Some programmer dude    8 年前

    首先,您必须记住,如果 char

    然后您必须记住较小类型的值 烧焦 uint8_t promoted 到 int (或可能) unsigned int 标志扩展 已签名类型的。

    所以如果 烧焦 是有符号的,值 0b10010101 将被提升为 0b11111111111111111111111110010101 (使用 two's complement 对于负数)。哪个是 非常 与无符号值不同 0b00000000000000000000000010010101 .