我正在寻找关于基本c++类型大小的详细信息。
我知道这取决于架构(16位、32位、64位)和编译器。
但是c++有标准吗?
我在32位架构上使用Visual Studio 2008。以下是我得到的答案:
char : 1 byte
short : 2 bytes
int : 4 bytes
long : 4 bytes
float : 4 bytes
double: 8 bytes
我试图在不同的架构和编译器下找到char、short、int、long、double、float(以及其他我没有想到的类型)的大小的可靠信息,但没有多大成功。
我注意到这里所有的其他答案几乎都集中在整型上,而提问者也问了浮点数。
我不认为c++标准需要它,但是现在大多数常见平台的编译器通常都遵循IEEE754标准的浮点数。该标准指定了四种类型的二进制浮点数(以及一些BCD格式,我从未见过c++编译器支持这些格式):
半精度(binary16) - 11位有效值,指数范围-14到15
单精度(binary32) - 24位有效值,指数范围-126至127
双精度(binary64) - 53位有效值,指数范围-1022到1023
四倍精度(binary128) - 113位有效值,指数范围-16382到16383
那么,这是如何映射到c++类型的呢?一般浮子采用单精度;因此,sizeof(float) = 4。然后double使用双精度(我相信这是double名称的来源),长double可能是双精度或四倍精度(在我的系统上是四倍精度,但在32位系统上可能是双精度)。我不知道有哪个编译器能提供半精度浮点数。
总结一下,通常是这样的:
Sizeof (float) = 4
Sizeof (double) = 8
Sizeof (long double) = 8或16
c++标准是这样说的:
3.9.1,§2:
There are five signed integer types :
"signed char", "short int", "int",
"long int", and "long long int". In
this list, each type provides at least
as much storage as those preceding it
in the list. Plain ints have the
natural size suggested by the
architecture of the execution
environment (44); the other signed
integer types are provided to meet
special needs.
(44) that is, large enough to contain
any value in the range of INT_MIN and
INT_MAX, as defined in the header
<climits>.
结论:这取决于您使用的是哪种体系结构。其他任何假设都是错误的。
我们可以为类型定义同义词,这样我们就可以创建自己的“标准”。
在sizeof(int) == 4的机器上,我们可以定义:
typedef int int32;
int32 i;
int32 j;
...
所以当我们把代码转移到另一台机器上,当long int的大小是4时,我们可以重新定义int的一次出现。
typedef long int int32;
int32 i;
int32 j;
...
有一个标准,它是在各种标准文档(ISO, ANSI等)中指定的。
维基百科有一个很好的页面解释了各种类型和它们可以存储的最大值:
计算机科学中的整数。
然而,即使使用标准的c++编译器,您也可以使用以下代码片段相对容易地找到:
#include <iostream>
#include <limits>
int main() {
// Change the template parameter to the various different types.
std::cout << std::numeric_limits<int>::max() << std::endl;
}
std::numeric_limits的文档可以在Roguewave上找到。它包含大量其他命令,您可以调用这些命令来查找各种限制。这可以用于任何传递大小的任意类型,例如std::streamsize。
约翰的回答包含了最好的描述,因为那些肯定是成立的。不管你在什么平台上,有另一个很好的页面详细介绍了每种类型必须包含多少位:int类型,这是在标准中定义的。
我希望这能有所帮助!
我注意到这里所有的其他答案几乎都集中在整型上,而提问者也问了浮点数。
我不认为c++标准需要它,但是现在大多数常见平台的编译器通常都遵循IEEE754标准的浮点数。该标准指定了四种类型的二进制浮点数(以及一些BCD格式,我从未见过c++编译器支持这些格式):
半精度(binary16) - 11位有效值,指数范围-14到15
单精度(binary32) - 24位有效值,指数范围-126至127
双精度(binary64) - 53位有效值,指数范围-1022到1023
四倍精度(binary128) - 113位有效值,指数范围-16382到16383
那么,这是如何映射到c++类型的呢?一般浮子采用单精度;因此,sizeof(float) = 4。然后double使用双精度(我相信这是double名称的来源),长double可能是双精度或四倍精度(在我的系统上是四倍精度,但在32位系统上可能是双精度)。我不知道有哪个编译器能提供半精度浮点数。
总结一下,通常是这样的:
Sizeof (float) = 4
Sizeof (double) = 8
Sizeof (long double) = 8或16