如何解释C程序的输出
代码: 输出为:如何解释C程序的输出,c,C,代码: 输出为:fffffff7。 我的机器是little endian。当然我知道*b等于0xf7,但我不知道为什么printf()的输出是这样的。+-----------------------+ int main() { unsigned int a = 0xfffffff7; char *b = (char *)&a; printf("%08x",*b); } |F7由于您的系统是small endian,a作为F7 FF存储在内存中 b指向a的第一个字
fffffff7
。
我的机器是little endian。当然我知道*b
等于0xf7
,但我不知道为什么printf()
的输出是这样的。+-----------------------+
int main()
{
unsigned int a = 0xfffffff7;
char *b = (char *)&a;
printf("%08x",*b);
}
|F7由于您的系统是small endian,a
作为F7 FF
存储在内存中
b
指向a
的第一个字节。(F7)
*b
计算为char
。(F7)
*b
升级为int
以作为参数传递,因为它的类型为char
(通常默认为signed char
),它被符号扩展为fffffff 7
您期望的是什么?%08x
要求十六进制,8个字符宽,前导零。当将字符打印为整数类型时,在打印前会将其加宽为整数。为什么输出不为000000 f7char
,在您的系统上,被定义为有符号,因此符号位在加宽时会扩展。这是未定义的行为。您正在向printf()函数传递一个char
(它被提升为int
,并告诉printf()
您传递的是某种类型的指针。在指针大于整数的平台上,这可能会崩溃,这是完全有可能的。@t对于这个错误,我深表歉意。重要的是您已经解决了:)
+-----------------------+
| F7 <--b=(char *) &a|
| FF |
| FF |
| FF |
| |
+-----------------------+
printf("%08x",*b);