我正在寻找关于基本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(以及其他我没有想到的类型)的大小的可靠信息,但没有多大成功。


当前回答

对于32位系统,“事实上”的标准是ILP32——也就是说,int、long和pointer都是32位的量。

对于64位系统,主要的Unix“事实上”标准是LP64 -长和指针是64位(但int是32位)。Windows 64位标准是LLP64 - long long和pointer是64位(但long和int都是32位)。

曾经,一些Unix系统使用ILP64组织。

这些事实上的标准没有一个是由C标准(ISO/IEC 9899:1999)立法的,但都是被C标准所允许的。

并且,根据定义,sizeof(char)是1,尽管在Perl配置脚本中进行了测试。

注意,有些机器(Crays) CHAR_BIT远大于8。这意味着,IIRC sizeof(int)也是1,因为char和int都是32位的。

其他回答

在64位机器上:

int: 4
long: 8
long long: 8
void*: 8
size_t: 8

如前所述,大小应该反映当前的体系结构。如果你想知道当前编译器是如何处理的,你可以在limits.h中取一个峰值。

正如你提到的,这很大程度上取决于编译器和平台。为此,请查看ANSI标准http://home.att.net/~jackklein/c/inttypes.html

下面是微软编译器的一个:数据类型范围。

我注意到这里所有的其他答案几乎都集中在整型上,而提问者也问了浮点数。

我不认为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

1)文章“64位程序开发中被遗忘的问题”中的表N1

2)“数据模型”