c语言 char指针指向的数据大于一字节

图片说明
输出是1,fffffff7,为什么char指针可以输出大于1字节的数据

printf不管传进来的是什么类型的指针,决定输出的只是前面的格式输出符

楼上说的对,当参数是指针时,printf的格式参数(比如%x)决定了如何解释/解析该地址开始的二进制内容,与指针类型无关。只是这里传递的并不是指针,而是数值,因此情况稍有不同。


从楼主的输出来看,机器应该是小端,也就是说对于4字节的byte而言,首地址存的是最后一个字节,因此当楼主进行

 char *b = (char *)&a;

操作时b得到了最后一个字节的值,即0xF7.

然而明明是一个大于127的值,楼主非要定义成char而不是unsigned char,于是引起了越界的问题。这个时候b在内存里是11110111,
当精度扩展时通过符号位扩展,成为)xFFFFFFF7,因此使用%x输出时变成0xFFFFFFF7.

这里楼主不妨试一下,将0xFFFFFFF7后面的F7改成任何一个小于128的数字估计结果都是正确的(只有这两位16进制数字,没有前面的一堆F),
或者把两个char * 改成unsigned char *目测结果也应该是正确的.
于此相反,如果楼主保持现在的代码,只修改a,即使楼主把前面的一堆F改成别的,比如a=0x123456F7, 输出的应该还是0xFFFFFFF7

*b的值是0xf7,当传递给printf是是传值的,即0xf7。传递参数时,为参分配的临时空间至少是4字节的,因此,虽然传的是char型,但在printf函数中,占用四字节。而且,它对应格式符是%x会被当做正整数看待。这里关键是char类型是有符号的。值0x7这里代表负数-8,当转为整数时,符号位扩展,变成0xfffffff7,仍然是-8。如果你直接传值0xf7,或者用(unsigned char)*b,结果就不一样