c - union 的二进制表示

标签 c unions

在下面的程序中:

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 读取是实现定义的等等等等。

静止。

在“普通”平台上

(又名任何具有足够新编译器的“常规”PC)

您将得到一个整数,其位模式与您的原始 float 之一相匹配,描述为 e.g. here

float bit pattern

现在,符号位与 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/

相关文章:

c - C 中 POSIX 线程的并行 I/O

c - 当我调用 jmp 时,我在 c 内联汇编中遇到了段错误

c - 访问与条件表达式相邻的结构体字段

无法找出这里指针的错误吗?

c - 没有定义函数参数类型默认为int?我疯了吗?

c - 平方根 union 和位移位

在 MPI 上创建结构和 union

c - 在c中访问 union 成员

关于另一个 union 中 union 字段的编译错误

c++ - 共同的初始序列和比对