2012-07-16 53 views
5

我需要一种跨体系结构的方式来确保浮点数为4个字节(就像在32位窗口上一样)。例如,在我创建的结构中,我使用而不是int来确保一个长度为4个字节的整数值。确保浮点大小为4字节的C++

我怎么能用浮子做这个?我知道我可以用类型替换该值;然而,当在64位系统上强制转换为float时,我不会遇到问题吗?

+5

该标准甚至不保证存在4字节的'float'。但是我想象一下,找到一个sizeof(float)!= sizeof(int32_t)''的架构是非常困难的。 – Mysticial 2012-07-16 02:16:51

+2

我有个坏消息:'__int32'不是跨平台的。 – 2012-07-16 02:18:10

+4

*旁白*:'__int32'不保证存在于每个(或任何)系统上。改为尝试'int32_t'。 – 2012-07-16 02:18:16

回答

7

我需要一个跨架构的方法来确保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 
} 
+2

如果大小不是4字节,那只会杀死程序。 – Qix 2012-07-16 02:18:12

+0

没错。如果'float'不是4个字节,你希望它做什么? – 2012-07-16 02:19:07

+0

我*需要*浮点数为4个字节。 – Qix 2012-07-16 02:19:41

3

由于浮点数据大小与CPU有关,所以没有符合标准的方法来执行此操作。 IEEE-754标准(支持浮点的所有处理器都使用我所知)将单精度浮点值定义为4字节。

没有标准提及的原因是因为C的编写者不想将自己绑定到浮点的特定实现上,以防标准更改或更新。而且还因为CPU决定了单精度浮点数和双精度浮点数的大小和实现,所以它不是编译器关心的问题。

如果您担心,可以使用static_assert以确保sizeof(float) == 4;不过,这不是你要碰到的问题,我不会想象。如果是这样,你应该在个案的基础上处理它(这实际上是一个逐架构的基础)。

+0

这很合理。我将不得不更多地阅读IEEE-754标准(每个人都会围绕这些标准进行讨论,但我仍然试图了解它们是什么以及它们如何相互配合)。 – Qix 2012-07-16 02:39:20

+0

如果你还在身边,你应该把接受的答案提供给Rob-phi。我只是扩大了他的答案。 – OmnipotentEntity 2012-07-16 02:45:43