为什么char *需要4个字节而不是1个字节

时间:2019-09-13 18:16:42

标签: c

我编写了一个程序来查找系统的字节序。由于指针值为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",);

}

1 个答案:

答案 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);