为什么通过使用联合对象并在那里定义与 int32 和 float32 相同的内存我得到不同的解决方案?
float/int union 有意义的唯一原因是float 和int 共享storage size 的32-bits。您缺少的是对floats(实际上是所有浮点数)存储在IEEE-754 Floating Point Format 中的理解(浮点数是单精度,双精度数是双精度等。)
当您使用float/int union 技巧时,您会看到integer value 即integer equivalent 到IEEE-754 Single-Precision Floating Point Format 的float。这两个值与表示相同的数字值无关。您可以将它们占用的内存视为float 或integer,因为它们都占用32-bits 的内存。如果您查看float 窗口,您会看到32-bits 的含义是float。另一方面,如果您将相同的32-bits 视为integer,您将看到与32-bits 相同的integer 的内容。查看二进制表示的示例通常会有所帮助。
以float 值123.456 为例。如果您查看内存中的32-bits,您会看到:
The float value entered : 123.456001
binary value in memory : 01000010-11110110-11101001-01111001
As unsigned integer : 1123477881
IEEE-754 单精度浮点表示是内存中的一种特定浮点格式,由以下 3 个组件组成:
0 1 0 0 0 0 1 0 1 1 1 1 0 1 1 0 1 1 1 0 1 0 0 1 0 1 1 1 1 0 0 1
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -|
|s| exp | mantissa |
其中s 是sign-bit,exp 是biased exponent,其余的23-bits 称为mantissa。您不可能期望投射float 123.456 并得到任何接近到integer 123,你大约要离开7 orders of magnitude
它不也将浮点数转换为 int32 吗?
答案:否