在下面的程序中:
union
{
int i;
float f;
} u;
假设 32 位编译器,u
在内存中分配了 4 个字节。
u.f = 3.14159f;
3.14159f
在这 4 个字节中使用 IEEE 754 表示。
printf("As integer: %08x\n", u.i);
u.i
在这里代表什么? IEEE 754 二进制表示是否解释为 4 字节 signed int
?
最佳答案
从 i
读取是实现定义的等等等等。
静止。
在“普通”平台上
float
是 IEEE-754 binary32 formatint
是 32 位 2 的补码float
和int
的字节顺序is the same- 通过
union
类型双关 is well defined (C99+)
(又名任何具有足够新编译器的“常规”PC)
您将得到一个整数,其位模式与您的原始 float
之一相匹配,描述为 e.g. here
现在,符号位与 int
的 2 的补码表示混淆了,因此您可能想使用 unsigned
类型来进行此类实验.此外,memcpy
是执行类型双关的更安全方法(您不会看到肮脏的外观和关于标准的讨论),所以如果您执行类似的操作:
float x = 1234.5678;
uint32_t x_u;
memcpy(&x_u, &x, sizeof x_u);
现在您可以轻松提取 FP 表示的各个部分:
int sign = x_u>>31; // 0 = positive; 1 = negative
int exponent = ((x_u>>23) & 0xff; // apply -127 bias to obtain actual exponent
int mantissa = x_u & ~((unsigned(-1)<<23);
(请注意,这完全忽略了所有“魔术”模式 - 想到安静的信号 NaN 和次正规数)
关于c - union 的二进制表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40057224/