我正在寻找关于基本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++ 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
加上无符号的版本。
“快”意味着什么,如果有的话,取决于实现。它也不需要在所有方面都是最快的。
我注意到这里所有的其他答案几乎都集中在整型上,而提问者也问了浮点数。
我不认为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
我们可以为类型定义同义词,这样我们就可以创建自己的“标准”。
在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位,以此类推。