有没有一种方法可以在C++中声明32位浮点值-确保它始终是32位,而不管平台/编译器?
对于像这样的整数,我可以这样做:
#include <stdint.h>
uint32_t var; //32 bit unsigned integer
uint64_t var1; //64 bit unsigned integer
有没有办法对floats做这样的事情?就我所知道,
float var; //Usually is 32 bit, but NOT GUARANTEED to be 32 bit
是特定于实现的,并且不一定是32位。(如果我错了,请纠正我)。
我使用的是qt,所以如果有任何使用它的解决方案我都会接受--我找不到任何像quint16这样的浮点数(qreal会根据平台改变大小)。
发布于 2013-09-10 03:35:44
您正在使用Qt。这是特定于C++的,所以我不确定为什么这个问题被标记为C。
据我所知,在所有支持Qt的平台上,float
类型都是32位的。
如果有人决定将Qt移植到具有64位float
的Cray向量机,那么您无论如何都不会拥有32位浮点类型(除非您自己在软件中实现它,但我看不出这有什么用)。
没有与<stdint.h>
/ <cstdint>
对应的<stdfloat.h>
/ <cstdfloat>
。C和C++提供了float
、double
和long double
,并对它们施加了最低限度的要求,但不提供请求任何特定大小的浮点类型的方法。
最好的办法可能是在main
中添加类似这样的内容,或者在程序启动时保证会调用的某个函数中添加如下内容:
assert(CHAR_BIT * sizeof (float) == 32);
如果您的代码隐式地依赖于此,那么也可以使用CHAR_BIT == 8
。
assert
不太可能启动--如果启动了,您就会遇到更大的问题。
您可能需要重新考虑是否真的需要32位浮点类型。如果您的代码运行在具有64位float
的系统上,如何才能满足您的需求呢?
发布于 2013-09-10 03:53:00
虽然没有这样大小的浮点类型,但您始终可以静态地断言大小为32位。甚至可能是像全局字符数组这样简单的东西:
#include <climits>
char static_assert_float32[1 - (2 * ((sizeof(float) * CHAR_BIT) != 32))];
如果float
不是32位,则无法通过声明负大小的数组进行编译。
发布于 2013-09-10 03:21:04
最常见的C和C++实现将使用32位float
类型。如果您真的需要捕获任何平台,但情况并非如此,您可以使用以下代码在程序早期抛出错误:
#include <limits.h>
if (sizeof(float) * CHAR_BIT != 32)
// error code here
不幸的是,我不知道一种在编译时检测它的方法,我之前的回答是有缺陷的。
https://stackoverflow.com/questions/18705192
复制相似问题