c - 是否可以在 C 常量表达式中进行 union 类型双关语?

标签 c nan unions

我有一个使用 union 将一系列字节转换为浮点数的函数。我用它来精确表示一些难以写出的数字,例如 NaN 和 Infinity。

float i2f(uint32_t i)
{
    union { uint32_t i; float f; } u;
    u.i = i;
    return u.f;
}
我遇到的问题是我不能在需要常量表达式的地方使用这个函数,比如静态初始值设定项:
// error: initializer element is not constant
float fs[2] = { i2f(0xffc00000), i2f(0x7f800000) };
是否有另一种方法可以实现相同的效果,使得结果表达式作为常量表达式有效?
到目前为止,我发现将 NaN 表示为常量的唯一方法是使用 __builtin_nan扩展,不可移植。如果可能的话,我更喜欢在 C 标准范围内工作的东西。

最佳答案

C 标准没有在严格遵守的代码中提供任何特性,这些特性会为此产生一个整数常量表达式。
我们可以得到的最接近的可能是创建一个复合文字并获取其中的一个成员:

(union { uint32_t u; float f; }) { 0xffc00000} .f
然而,这不是 C 标准定义的常量表达式,除了 C 2018 6.6 10 说“一个实现可以接受其他形式的常量表达式”。
可以满足您的目的只是定义包含所需值的 union :
union { uint32_t u; float f; } fs[2] = { { 0xffc00000} , { 0x7f800000 } };
之后你会使用他们的成员,fs[0].f , fs[1].f , 等等。

关于c - 是否可以在 C 常量表达式中进行 union 类型双关语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68674919/

相关文章:

c - Ubuntu Box 上的应用程序分析

c - c中的指针操作

c - 获取无限循环的问号

python - 根据 pandas 数据框中的相邻列将 NaN 值替换为特定文本

嵌套结构的 C 问题(看起来 1 个实例是在没有明确定义的情况下定义的)

c - 当用户按回车键时结束 while 循环,不能使用 #include <string.h>

JavaScript:什么是 NaN、Object 或 primitive?

python - 如果列全部为 nan,则使 numpy.nanargmin 返回 nan

c++ - 为什么 long long union 成员的对齐比包含的 union/struct 大?这个对吗?

通过 typedef 定义 C++ 新类型