这个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 做好了准备。
这个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 做好了准备。