我正在寻找关于基本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(以及其他我没有想到的类型)的大小的可靠信息,但没有多大成功。
我们可以为类型定义同义词,这样我们就可以创建自己的“标准”。
在sizeof(int) == 4的机器上,我们可以定义:
typedef int int32;
int32 i;
int32 j;
...
所以当我们把代码转移到另一台机器上,当long int的大小是4时,我们可以重新定义int的一次出现。
typedef long int int32;
int32 i;
int32 j;
...
有标准。
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位,以此类推。
对于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位的。