我编写了一个程序来查找系统的字节序。由于指针值为0xffffffef而不是0xef,因此它不起作用。为什么指针值是0xffffffef?我将其声明为char *,仅应占用1个字节。 我可以通过* ptr&0xff解决此问题,但我不知道为什么指针值是4个字节而不是1个字节。
int main() {
uint32_t value = 0xdeadbeef;
char *ptr;
ptr = (char*)&value;
if(*ptr == 0xef){
printf("it is little endianeness");
}
printf(" 0x%x *ptr\n",);
}
答案 0 :(得分:1)
printf(" 0x%x *ptr\n",);
应该是
printf(" 0x%x\n", *ptr);
,但是将其打印为0xffffffef
而不是0xef
的原因是因为%x
将输入值解释为unsigned int
,因此char值首先是符号扩展以匹配int
的大小。 0xef
是二进制11101111
,请注意已设置高位。当扩展为有符号值时,该高位会在添加的位中重复出现:
11111111 11111111 11111111 11101111
又名0xffffffef
。
为避免扩展 sign ,请先将char值强制转换为 unsigned 值,然后将其扩展为 zero :
00000000 00000000 00000000 11101111
aka 0x000000ef
,或者当省略前导零时只是0xef
:
printf(" 0x%x\n", (unsigned char) *ptr);
或者,在C ++ 11和更高版本中,可以改用%hhx
,它将输入值解释为unsigned char
,因此可以避免显式的类型转换:
printf(" 0x%hhx\n", *ptr);