我正在寻找有关基本 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 ++ 标准没有指定整数类型的大小(以字节为单位),但是指定了它们必须能够容纳的最小范围。您可以从所需范围推断最小大小(以位为单位)。您可以从中推断出最小大小(以字节为单位),并可以定义定义字节中位数CHAR_BIT
宏的值。除最晦涩的平台外,所有平台均为 8,且不得小于 8。
char
另一个约束是其大小始终为 1 个字节,即CHAR_BIT
位(因此而得名)。这在标准中有明确说明。
C 标准是C ++ 标准的规范性参考,因此,即使没有明确说明这些要求,C ++ 仍需要C 标准要求的最小范围(第 22 页),与 “数据类型范围” 中的最小范围相同。 MSDN :
signed char
:-127 到 127(注意,不是 - 128 到 127;这可容纳 1 的补码和符号幅度平台)unsigned char
:0 到 255char
:与已signed char
或未unsigned char
相同的范围,实现定义signed short
字母:-32767 至 32767unsigned short
:0 到 65535signed int
:-32767 至 32767unsigned int
:0 到 65535signed long
:-2147483647 至 2147483647unsigned long
:0 到 4294967295signed long long
:-9223372036854775807 至 9223372036854775807unsigned long long
:0 到 18446744073709551615 C ++(或 C)实现可以将类型的sizeof(type)
为任何值,只要
sizeof(type) * CHAR_BIT
计算得出的位数足以包含所需的范围,并且sizeof(int) <= sizeof(long)
)。综合所有这些,我们保证:
char
, signed char
和unsigned char
至少为 8 位signed short
, unsigned short
,有signed int
和unsigned int
至少为 16 位signed long
和unsigned long
至少为 32 位signed long long
整型和unsigned long long
至少为 64 位float
或double
的大小,但double
至少提供与float
一样的精度。
实际的特定于实现的范围可以在 C 的<limits.h>
<climits>
中找到(甚至更好的是,在<limits>
标头中的std::numeric_limits
例如,这是您将找到int
最大范围的方法:
C:
#include <limits.h>
const int min_int = INT_MIN;
const int max_int = INT_MAX;
C ++ :
#include <limits>
const int min_int = std::numeric_limits<int>::min();
const int max_int = std::numeric_limits<int>::max();
对于 32 位系统,“事实上的” 标准是 ILP32 - 即int
, long
和指针都是 32 位量。
对于 64 位系统,主要的 Unix“事实上” 标准是 LP64- long
和指针是 64 位(而int
是 32 位)。 Windows 64 位标准为 LLP64- long long
和指针均为 64 位(但long
和int
均为 32 位)。
一次,某些 Unix 系统使用 ILP64 组织。
C 标准(ISO / IEC 9899:1999)均未立法这些事实上的标准,但所有标准均被其允许。
并且,尽管在 Perl configure 脚本中进行了测试,但根据定义, sizeof(char)
为1
请注意,有些机器(Crays)的CHAR_BIT
远大于 8。这意味着 IIRC, sizeof(int)
也为 1,因为char
和int
均为 32 位。
实际上,没有这样的事情。通常,您可以期望std::size_t
表示当前体系结构上的无符号本机整数大小。即 16 位,32 位或 64 位,但并非始终如答案中所指出的那样。
至于所有其他内置类型,它实际上取决于编译器。以下是摘录自最新 C ++ 标准的当前工作草案的两个摘录:
有五种标准的带符号整数类型:带符号的 char,short int,int,long int 和 long long int。在此列表中,每种类型提供的存储量至少与列表中位于其前面的类型相同。
对于每种标准有符号整数类型,都有一个对应的(但不同的)标准无符号整数类型:unsigned char,unsigned short int,unsigned int,unsigned long int 和 unsigned long long int,每种类型都占用相同的数量。存储并具有相同的对齐要求。
如果需要,可以静态(编译时)声明这些基本类型的大小。如果 sizeof 假设发生变化,它将提醒人们考虑移植您的代码。