考虑以下代码:

typedef union
{
    int integer_;
    char mem_[4];
} MemoryView;

int main()
{
    MemoryView mv;
    mv.integer_ = (int)'\xff';
    for(int i=0;i<4;i++)
        std::cout << mv.mem_[i]; // output is \xff\xff\xff\xff

    mv.integer_ = 0xff;
    for(int i=0;i<4;i++)
        std::cout << mv.mem_[i]; // output is \xff\x00\x00\x00

    // now i try with a value less than 0x80
    mv.integer_ = (int)'\x7f'
    for(int i=0;i<4;i++)
        std::cout << mv.mem_[i]; // output is \x7f\x00\x00\x00


    mv.integer_ = 0x7f;
    for(int i=0;i<4;i++)
        std::cout << mv.mem_[i]; // output is \x7f\x00\x00\x00

    // now i try with 0x80
    mv.integer_ = (int)'\x80'
    for(int i=0;i<4;i++)
        std::cout << mv.mem_[i]; // output is \x80\xff\xff\xff

    mv.integer_ = 0x80;
    for(int i=0;i<4;i++)
        std::cout << mv.mem_[i]; // output is \x80\x00\x00\x00

}

我用GCC4.6和MSVC2010进行了测试,结果是相同的。
当我尝试使用小于0x80的值输出是正确的但具有大于0x80的值时,
剩下的三个字节是'\ xff'。

中央处理器(CPU):Intel'core 2 Duo'
字节序:小
操作系统:Ubuntu 12.04LTS(64bit),Windows 7(64 bit)

最佳答案

'\xff'的类型是charchar是许多平台上的带符号整数类型,因此'\xff的值为负(-1而不是255)。当您将其转换(投射)为int(也已签名)时,会得到一个具有相同负值的int值。

严格小于0x80的任何内容都将是肯定的,您将从转换中获得肯定。

关于c++ - 为什么(int )'\xff'!= 0xff但是(int )'\x7f' == 0x7f?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17896321/

10-09 09:50