#include<stdio.h>
int main()
{
int a = 0xabcdef;
char *b = &a;
printf("%x",*b);
return 0;
}
上面的代码将输出显示为ffffffef
。这个输出的原因是什么?
答案 0 :(得分:1)
指针*b
是char
类型指针,它指向int
类型变量。这是输出错误的原因。将指针变量*b
声明为int
类型。
int a = 0xabcdef;
int *b = &a;
printf("%x",*b);
答案 1 :(得分:1)
首先,使用类型b
声明变量char *
。您正尝试使用&a
类型的值int *
对其进行初始化。这是非法的。代码无效C.行为未定义。
其次,如果您的编译器设法让这个初始化漏掉,那么它可能会执行int *
值到char *
类型的隐式转换。这使得指针b
仅指向变量a
的一个字节。该单字节的值是您通过*b
看到的值。哪个字节(根据a
的原始值)是实现定义的。例如。您通常会得到一个低位字节(0xEF
)或一个高位字节(0xAB
)。
第三,是实现定义类型char
是签名还是未签名。这意味着*b
的值可能是签名或未签名的,具体取决于您的实现。当您将char
值*b
传递给可变函数printf
时,该char
值会自动转换为int
类型。转换的结果通常取决于类型char
的签名。如果您的b
指向0xEF
字节,char
已签名且int
为32位宽且使用2的补码,则结果(以十六进制表示)将看起来像0xFFFFFFEF
(这是一个负值)。
第四,%x
格式说明符需要unsigned int
参数,而是传递具有潜在负值的int
参数。行为未定义。
换句话说,您的程序只是一大堆未定义和实现定义的行为。试图解释为什么你得到那个特定的输出没有多大意义。