C++确保浮点大小为4个字节

Qix*_*Qix 7 c++ floating-point size cross-platform consistency

我需要一种跨架构的方法来确保浮点数为4个字节(就像在32位窗口上一样).例如,在我正在创建的结构中,我正在使用__int32而不是int确保一个4字节长的整数值.

我怎么能用漂浮物来做这件事?我知道我可以用一个__int32类型替换值; 但是,当在64位系统上转换为浮点数时,我不会有问题吗?

Rob*_*obᵩ 9

我需要一种跨架构的方法来确保浮点数为4个字节

int32_t浮点值没有模拟值.

实现您想要的唯一跨平台方法是使用运行时或静态断言来测试它.

#include <cassert>
int main () {
    assert(sizeof(float) == 4);
    // If control reaches this line, then you've 
    // ensured that float is 4 bytes.


    // rest of your program goes here
}
Run Code Online (Sandbox Code Playgroud)

  • @ Di-0xide:我使用过具有非IEEE浮点硬件的系统(IBM大型机,VAX和Cray矢量系统).特别是Crays有64位`float`和*no*32位浮点类型.这些系统是在IEEE标准存在之前设计的; 它们可能是*为什么*标准被发明了.你不可能自己遇到这样的系统. (6认同)
  • @ Di-0xide如果您正在寻找一种完全证明且符合标准的方法来执行此操作:**它不存在.期.** (4认同)
  • @Mysticial假设有32位整数可用,他当然可以在软件中模拟IEEE 754 - 我希望他不关心性能. (2认同)

Omn*_*ity 6

没有标准的兼容方法,因为浮点数据大小与CPU相关联.的IEEE-754标准(其支持浮点使用据我所知的所有处理器)限定单精度浮点值作为4个字节.

没有标准提及的原因是因为C的编写者不希望将自己绑定到浮点的特定实现,以防标准更改或更新.而且因为CPU无论如何都会确定单精度浮点数和双精度浮点数的大小和实现,因此它不是编译器所关注的.

如果你担心它,你可以使用a static_assert来确保sizeof(float) == 4; 但是,这不是你要碰到的问题,我无法想象.如果它是你应该逐个处理它(这实际上将是一个逐个体系结构的基础.)