所以,我正在尝试一些东西,我注意到如果你读取一个包含 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)
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 char或uint8_t。