异常输出的十六进制数

时间:2014-09-16 16:39:51

标签: c

#include<stdio.h> 

int main()                              
{                        
    int a = 0xabcdef;

    char *b = &a;
    printf("%x",*b);

    return 0;
}    

上面的代码将输出显示为ffffffef。这个输出的原因是什么?

2 个答案:

答案 0 :(得分:1)

指针*bchar类型指针,它指向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参数。行为未定义。

换句话说,您的程序只是一大堆未定义和实现定义的行为。试图解释为什么你得到那个特定的输出没有多大意义。