协慌网

登录 贡献 社区

C ++ 标准说明 int,long 类型的大小是什么?

我正在寻找有关基本 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

我试图找到没有可靠信息的可靠信息,这些信息说明了charshortintlongdoublefloat (以及其他我没有想到的类型)的大小。

答案

C ++ 标准没有指定整数类型的大小(以字节为单位),但是指定了它们必须能够容纳的最小范围。您可以从所需范围推断最小大小(以位为单位)。您可以从中推断出最小大小(以字节为单位),并可以定义定义字节中位数CHAR_BIT宏的值。除最晦涩的平台外,所有平台均为 8,且不得小于 8。

char另一个约束是其大小始终为 1 个字节,即CHAR_BIT位(因此而得名)。这在标准中有明确说明。

C 标准是C ++ 标准的规范性参考,因此,即使没有明确说明这些要求,C ++ 仍需要C 标准要求的最小范围(第 22 页),与 “数据类型范围” 中的最小范围相同。 MSDN

  1. signed char :-127 到 127(注意,不是 - 128 到 127;这可容纳 1 的补码和符号幅度平台)
  2. unsigned char :0 到 255
  3. “普通” char :与已signed char或未unsigned char相同的范围,实现定义
  4. signed short字母:-32767 至 32767
  5. unsigned short :0 到 65535
  6. signed int :-32767 至 32767
  7. unsigned int :0 到 65535
  8. signed long :-2147483647 至 2147483647
  9. unsigned long :0 到 4294967295
  10. signed long long :-9223372036854775807 至 9223372036854775807
  11. unsigned long long :0 到 18446744073709551615

C ++(或 C)实现可以将类型的sizeof(type)为任何值,只要

  1. 表达式sizeof(type) * CHAR_BIT计算得出的位数足以包含所需的范围,并且
  2. 类型的顺序仍然有效(例如, sizeof(int) <= sizeof(long) )。

综合所有这些,我们保证:

  • charsigned charunsigned char至少为 8 位
  • signed shortunsigned short ,有signed intunsigned int至少为 16 位
  • signed longunsigned long至少为 32 位
  • signed long long整型和unsigned long long至少为 64 位

floatdouble的大小,但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 - 即intlong和指针都是 32 位量。

对于 64 位系统,主要的 Unix“事实上” 标准是 LP64- long和指针是 64 位(而int是 32 位)。 Windows 64 位标准为 LLP64- long long和指针均为 64 位(但longint均为 32 位)。

一次,某些 Unix 系统使用 ILP64 组织。

C 标准(ISO / IEC 9899:1999)均未立法这些事实上的标准,但所有标准均被其允许。

并且,尽管在 Perl configure 脚本中进行了测试,但根据定义, sizeof(char)1

请注意,有些机器(Crays)的CHAR_BIT远大于 8。这意味着 IIRC, sizeof(int)也为 1,因为charint均为 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 假设发生变化,它将提醒人们考虑移植您的代码。