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

8
我需要一种跨架构的方法来确保浮点数是4个字节(在32位Windows上也是如此)。例如,在我创建的结构中,我使用 __int32 而不是 int 来确保长度为4个字节的整数值。

那么我如何用浮点数实现呢?我知道我可以用 __int32 类型替换值; 但是,在64位系统上进行浮点转换时,会有问题吗?


7
标准甚至不能保证存在一个4个字节的 float。不过我想很难找到一个结构使得 sizeof(float) != sizeof(int32_t) - Mysticial
3
我有一个不好的消息:__int32 不是跨平台的。 - R. Martinho Fernandes
5
__int32” 并不保证在所有系统上(甚至任何一个系统上)都存在。请尝试使用 int32_t 替代它。 - Robᵩ
1
这感觉像是一个XY问题。@Di-0xide,你能退后一步,告诉我们更多关于你的程序是做什么的吗? - Robᵩ
@Mysticial,我见过一些8位微控制器编译器允许选择24位浮点和32位浮点之间的选项。 - phuclv
显示剩余21条评论
2个回答

12

我需要一种跨体系结构的方法来确保float类型变量是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
}

好的。如果float不是4个字节,你想让它做什么? - Robᵩ
4
如果你正在寻找一种全面且符合标准的方法来做这件事:“它不存在。没错。” - Mysticial
2
@Mysticial 假设有32位整数可用,他肯定可以在软件中模拟IEEE 754 - 我希望他不关心性能。 - Voo
1
@Di-0xide,是的。我能想到的每个编译器都有它。因为这是一个标准。IEEE 754.唯一会出现的情况是如果有人为平台编写了一个不遵守IEEE 754标准的新编译器。但是没有人会这样做,因为它无法与期望以那种形式处理浮点数的x86指令集兼容。所以你需要一款非标准实现浮点数的离奇CPU(除非你在做嵌入式系统,即使那样也很少见)。 - OmnipotentEntity
7
@Di-0xide:我使用过一些没有IEEE浮点硬件的系统(IBM大型机、VAX和Cray向量系统)。特别是Cray拥有64位的float没有32位浮点类型。这些系统是在IEEE标准出现之前设计的;它们可能是IEEE标准被发明的原因。你不太可能自己遇到这样的系统。 - Keith Thompson
显示剩余16条评论

6
由于浮点数大小与CPU相关联,因此没有一种符合标准的方法来处理这个问题。据我所知,所有支持浮点数的处理器都使用IEEE-754标准定义单精度浮点值为4字节。
没有标准提及的原因是,C语言的编写者不想将自己绑定到特定的浮点实现中,以防标准发生变化或更新。而且,由于CPU决定了单精度和双精度浮点数的大小和实现方式,因此编译器不需要关注这个问题。
如果您担心这个问题,可以使用static_assert来确保sizeof(float) == 4; 但我认为您不会遇到这样的问题。如果确实遇到了,您应该按情况处理(这实际上将基于架构)。

这很有道理。我需要更多地阅读IEEE-754标准(每个人都经常提到这些标准,但我仍在努力理解它们是什么以及它们如何相互关联)。 - Qix - MONICA WAS MISTREATED
如果你还在这里,你应该把采纳答案给Rob-phi。我只是在他的答案基础上进行了扩展。 - OmnipotentEntity

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接