我正在运行一个用于学习 C 的测试代码。但是我对十六进制负数的表示很好奇,为此我编写了一个测试代码。令我惊讶的是,通过运行该测试代码,我只收到零
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
的方式对齐得到四个 0
值字节。
关于c - 通过 printf 在 c 中打印负值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56779250/