这个C语言宏中的星号是干什么用的? #define asreal(x) (*((float *) &x))

What do the asterisk in this C language macro do? #define asreal(x) (*((float *) &x))

这个C语言宏中的星号是做什么用的?

#define asreal(x) (*((float *) &x))

我知道 C 中的指针,但是这个宏中的星号似乎是用来算术的?我不确定这里到底发生了什么。

是否将 &x 按位结果转换为浮点指针?那为什么在那个表达式外面多了一个星号呢?

&x - 获取 x

的地址

(float*) &x - 将其转换为 float*

*((float *) &x) 取消引用转换结果(结果类型为 float

(*((float *) &x)) - 用括号括起来,这样就不会干扰外部代码

所以基本上,代码在 x 中获取字节并将它们重新解释为 float。请注意,此宏仅在

时才有用
  • x 已经是 float 或者
  • 如果它包含等于有效 float 的二进制数据。

它不能用于将 int 值转换为 float(除非您尝试使用 int 的位表示,而不是值)如果调用它也会中断像 asreal(x + y) 或许多其他可能性。我也不确定它是否在 C 中定义了行为,但如果你试图“理解机器”,你可能已经为某些 UB 做好了准备。