我正在运行一个用于学习C的测试代码。但是我对负数的十六进制表示法感到好奇,为此我编写了一个测试代码。令我惊讶的是,通过运行测试代码,我只收到0
union unin
{
char chrArray[4];
float flotVal;
}uninObj;
uninObj.flotVal = -25;
printf("%x %x %x %x",uninObj.chrArray[0], uninObj.chrArray[1], /
uninObj.chrArray[2], uninObj.chrArray[3]);
printf("\n Float in hex: %x",uninObj.flotVal);
return 0;
最佳答案
将float
传递给期望unsigned int
的说明符是未定义的行为。
此外,unsigned int
所期望的%x
不能保证与float
相同的大小。因此,以这种方式欺骗printf
的企图可能会也可能不会“奏效”。
无论如何,对于一个变量函数,比如printf
,编译器将把float
类型的参数提升为double
,所以这可能是您(和我)获得0
输出的原因。
在我的系统上sizeof(double)
是指8
。sizeof(unsigned int)
是指4
。
如果你看一下union
那部分的字节输出,前两个是0
。因此,在将8个字节传递给函数而不是%x
所期望的4个字节之后,数据的对齐方式是%x
得到4个0
值字节。