读取包含 11111111 作为无符号整数的地址显示 4294967295

lad*_*dca 0 c++

所以,我正在尝试一些东西,我注意到如果你读取一个包含 11111111 作为无符号整数的地址,它显示值是 4294967295 而不是 255,这是为什么?

代码示例:

    unsigned int a = 255;
    unsigned int* p = &a;
    char *p0 = (char*)p;
    cout << (void*)p0 << " " <<(unsigned int)*p0<<endl;
Run Code Online (Sandbox Code Playgroud)

Lun*_*din 5

  • char *p0 = (char*)p;这里p0指向 的最低字节p。恰好存储在那里的值取决于字节序。可能是 0x00(大端)或 0xFF(小端)。
    什么是 CPU 字节序?

  • *p0在这里您可以访问假定的char. 由于char具有实现定义的符号,它可以管理数字 -128 到 127(假设 2 的补码)或 0 到 255。默认情况下,char 是有符号还是无符号?

  • 您的特定系统似乎使用了 signed char、 2 的补码、 Little Endian 。这意味着原始二进制值 0xFF 被解释为 -1 十进制。

  • (unsigned int)*p0强制从 -1 转换为unsigned int类型。这是在这个明确定义的规则之后完成的(C 6.3.1.4,同样的规则适用于 C++):

    否则,如果新类型是无符号的,则通过重复加或减一个新类型可以表示的最大值来转换该值,直到该值在新类型的范围内。

  • -1+ UINT_MAX+ 多一个 =
    -1+ UINT_MAX+ 1=
    UINT_MAX=
    4294967295在您的 32 位系统上。

经验教训:永远不要char用于文本以外的任何东西,永远不要用它来存储值。如果您需要 8 位整数类型或其他东西来表示原始二进制,请使用unsigned charuint8_t