首页 > 解决方案 > 将包含 11111111 的地址读取为无符号整数显示 4294967295

问题描述

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

代码示例:

    unsigned int a = 255;
    unsigned int* p = &a;
    char *p0 = (char*)p;
    cout << (void*)p0 << " " <<(unsigned int)*p0<<endl;

标签: c++

解决方案


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

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

  • 您的特定系统似乎使用有符号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.


推荐阅读