代码之家  ›  专栏  ›  技术社区  ›  jhaubrich.com

这个C语言宏中的星号是做什么的#定义为实(x)(*((浮点*)&x))

  •  -2
  • jhaubrich.com  · 技术社区  · 3 年前

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

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

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

    是&将x位结果转换为浮点指针?那么为什么在这个表达式之外还有一个星号呢?

    1 回复  |  直到 3 年前
        1
  •  2
  •   Yksisarvinen    3 年前

    &x -住址 x

    (float*) &x -投给 float*

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

    (*((float *) &x)) -把它包装起来,这样就不会干扰外部代码

    所以基本上,代码需要字节 十、 并将其重新解释为 浮动 。请注意,只有在以下情况下,此宏才有用:

    • 十、 是一个 浮动 已经或者
    • 如果它包含的二进制数据等于有效的 浮动 .

    它不能用于转换 int 重视 浮动 (除非你试着用它的位表示。) 智力 ,而不是值)如果像这样调用,它也会中断 asreal(x + y) 或者在很多其他方面。我也不确定这是否是C语言中定义的行为,但如果你试图“理解机器”,你可能已经为某些UBs做好了准备。