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


当前回答

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

2)“数据模型”

其他回答

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

更新:c++ 11将TR1中的类型正式引入标准:

Long Long int Unsigned long long int

以及<cstdint>中的"size "类型

int8_t int16_t int32_t int64_t (以及未签名的副本)。

另外,你会得到:

int_least8_t int_least16_t int_least32_t int_least64_t 加上未签名的对应项。

这些类型表示至少具有指定位数的最小整数类型。同样,也有“最快”的整数类型,至少具有指定的比特数:

int_fast8_t int_fast16_t int_fast32_t int_fast64_t 加上无符号的版本。

“快”意味着什么,如果有的话,取决于实现。它也不需要在所有方面都是最快的。

在64位机器上:

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

我们可以为类型定义同义词,这样我们就可以创建自己的“标准”。

在sizeof(int) == 4的机器上,我们可以定义:

typedef int int32;

int32 i;
int32 j;
...

所以当我们把代码转移到另一台机器上,当long int的大小是4时,我们可以重新定义int的一次出现。

typedef long int int32;

int32 i;
int32 j;
...

当涉及到不同架构和不同编译器的内置类型时,只需在你的架构上用编译器运行以下代码,看看它输出了什么。下面是我的Ubuntu 13.04 (Raring Ringtail) 64位g++4.7.3输出。还请注意下面的回答,这就是为什么输出是这样排序的:

有五种标准的有符号整型:有符号char、short int、int、long int和long long int。在此列表中,每种类型提供的存储空间至少与列表中前面的类型相同。”

#include <iostream>

int main ( int argc, char * argv[] )
{
  std::cout<< "size of char: " << sizeof (char) << std::endl;
  std::cout<< "size of short: " << sizeof (short) << std::endl;
  std::cout<< "size of int: " << sizeof (int) << std::endl;
  std::cout<< "size of long: " << sizeof (long) << std::endl;
  std::cout<< "size of long long: " << sizeof (long long) << std::endl;

  std::cout<< "size of float: " << sizeof (float) << std::endl;
  std::cout<< "size of double: " << sizeof (double) << std::endl;

  std::cout<< "size of pointer: " << sizeof (int *) << std::endl;
}


size of char: 1
size of short: 2
size of int: 4
size of long: 8
size of long long: 8
size of float: 4
size of double: 8
size of pointer: 8