int
通常是 32 位,但在标准中,int
不保证具有恒定的宽度。因此,如果我们想要 32 位int
,我们包含stdint.h
并使用int32_t
.
花车有没有等价物?我意识到浮点数有点复杂,因为它们不是以均匀的方式存储的,即符号、指数、有效数。我只想要一个double
保证存储在 64 位中的 1 个符号位、10 位指数和 52/53 位有效位(取决于您是否计算隐藏位)。
int
通常是 32 位,但在标准中,int
不保证具有恒定的宽度。因此,如果我们想要 32 位int
,我们包含stdint.h
并使用int32_t
.
花车有没有等价物?我意识到浮点数有点复杂,因为它们不是以均匀的方式存储的,即符号、指数、有效数。我只想要一个double
保证存储在 64 位中的 1 个符号位、10 位指数和 52/53 位有效位(取决于您是否计算隐藏位)。
虽然我不知道保证特定大小和格式的类型,但您在 C++ 中确实有一些选择。您可以使用<limits>
标头及其std::numeric_limits
类模板来找出给定类型的大小,std::numeric_limits::digits
告诉您尾数中的位数,并std::numeric_limits::is_iec559
告诉您该类型是否遵循 IEEE 格式。(有关在位级别操作 IEEE 数字的示例代码,请参阅 Google Test 的gtest-internal.h中的 FloatingPoint 类模板。)
根据当前的 C99 草案标准,附件 F,应该是两倍。当然,这是假设您的编译器符合标准的该部分。
对于 C++,我已经检查了 0x 草案和 1998 版标准的草案,但除了 numeric_limits 中指定 IEEE 754/IEC 559就像 Josh Kelley 提到的那样,在那个平台上使用。
但是,很少有平台不支持 IEEE 754——设计另一种浮点格式通常不会有回报,因为 IEEE 754 定义明确并且工作得很好——如果支持,那么可以合理地假设 double确实是 64 位(毕竟,IEEE 754-1985 称这种格式为双精度,所以这是有道理的)。
如果 double 不是双精度,请构建健全性检查,以便用户可以报告它,并且您可以单独处理该平台。如果平台不支持 IEEE 754,那么除非您自己实现,否则您无论如何都不会获得该表示。
另一个问题是浮点数的表示。这通常基于您正在运行的硬件(但并非总是如此)。大多数系统都使用 IEEE 754 浮点标准,但其他系统也可以有自己的标准(例如 VAX 计算机)。
IEEE 754 的维基百科解释http://en.wikipedia.org/wiki/IEEE_754-2008
我知道浮点数/双精度数没有变化。Float 多年来一直是 32 位,而 double 一直是 64 位。浮点语义非常复杂,但确实存在常量
#include <limits>
如果您不需要 std::numeric_limits 中的所有内容,boost.numeric.bounds是一个更简单的接口
Unfortunately, that's not guaranteed either. You have to check numeric_limits< T >
in
<limits>
.
But then again, I've never heard of an implementation where a double wasn't 64 bits long. If you wanted to just assume, you'd probably get away with it.
这种“固定宽度类型”的最大问题之一是很容易出错。您可能不想要 32 位整数。重点是什么?你想要的是一个至少可以存储 1>>31 的整数类型。那就是long int
。你甚至不需要<stdint.h>
那个。
同样,只要底层 C++至少为float
32位,您的脚本语言就可以实现 FP 类型。请注意,这仍然不能为您提供精确的行为。我相当肯定 C++ 不能保证-1.0/-3.0==1.0/3.0