gpt4 book ai didi

c++ - 将整数重新解释为 float 是否安全?

转载 作者:IT老高 更新时间:2023-10-28 22:18:11 24 4
gpt4 key购买 nike

注意:我最初错误地询问了static_cast;这就是为什么最佳答案首先提到 static_cast

我有一些带有小端浮点值的二进制文件。我想以独立于机器的方式阅读它们。我的字节交换例程(来自 SDL)对无符号整数类型进行操作。

在整数和 float 之间进行简单转换是否安全?

float read_float() {
// Read in 4 bytes.
Uint32 val;
fread( &val, 4, 1, fp );
// Swap the bytes to little-endian if necessary.
val = SDL_SwapLE32(val);
// Return as a float
return reinterpret_cast<float &>( val ); //XXX Is this safe?
}

我希望这个软件尽可能便携。

最佳答案

好吧,static_cast 是“安全的”并且它已经定义了行为,但这可能不是您所需要的。将整数值转换为浮点类型只会尝试在目标浮点类型中表示相同的整数值。 IE。 int 类型的 5 将变成 float 类型的 5.0(假设它可以精确表示)。

您似乎正在做的是在声明为 Uint32 变量的一 block 内存中构建 float 值的对象表示。要生成结果 float 值,您需要重新解释该内存。这将通过 reinterpret_cast

来实现
assert(sizeof(float) == sizeof val);
return reinterpret_cast<float &>( val );

或者,如果您愿意,也可以是同一事物的指针版本

assert(sizeof(float) == sizeof val);
return *reinterpret_cast<float *>( &val );

虽然这种类型的双关语不能保证在遵循严格别名语义的编译器中工作。另一种方法是这样做

float f;

assert(sizeof f == sizeof val);
memcpy(&f, &val, sizeof f);

return f;

或者您可以使用著名的 union hack 来实现内存重新解释。这在 C++ 中是非法的(未定义的行为),这意味着该方法只能用于某些支持它作为扩展的实现

assert(sizeof(float) == sizeof(Uint32));

union {
Uint32 val;
float f;
} u = { val };

return u.f;

关于c++ - 将整数重新解释为 float 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13982340/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com