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


当前回答

有标准。

C90标准要求

sizeof(short) <= sizeof(int) <= sizeof(long)

C99标准要求

sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)

这是C99的规格。第22页详细介绍了不同整型的大小。

下面是Windows平台的int类型大小(位):

Type           C99 Minimum     Windows 32bit
char           8               8
short          16              16
int            16              32
long           32              32
long long      64              64

如果你关心可移植性,或者你想要类型的名称反映大小,你可以查看头文件<inttypes.h>,其中有以下宏:

int8_t
int16_t
int32_t
int64_t

Int8_t保证为8位,int16_t保证为16位,以此类推。

其他回答

你可以使用:

cout << "size of datatype = " << sizeof(datatype) << endl;

Datatype = int, long int等。 您将能够看到您键入的任何数据类型的大小。

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

对于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位的。

更新: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 加上无符号的版本。

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

不,字体大小没有标准。标准只要求:

sizeof(short int) <= sizeof(int) <= sizeof(long int)

如果你想要一个固定大小的变量,你能做的最好的事情就是像这样使用宏:

#ifdef SYSTEM_X
  #define WORD int
#else
  #define WORD long int
#endif

然后可以使用WORD定义变量。不是说我喜欢这个,而是说这是最方便的方式。