我一直在寻找一段时间,但无法找到这个看似简单的问题的明确答案:int的默认长度是多少?
我知道默认情况下会签署一个int。但它是短期还是长期?
根据以下页面中的“基本数据类型”表,默认情况下int是一个long int(4个字节)。 http://www.cplusplus.com/doc/tutorial/variables/
总是如此,还是取决于操作系统(32位/ 64位),编译器还是其他东西?
答案 0 :(得分:13)
这取决于编译器实现者。 int
应该是平台的最佳“原生”长度。这里最好的原生通常是指目标处理器使用的最方便/高效/快速的尺寸。通常,您可以期望int
具有与处理器(整数)寄存器相同的大小。
正如其他人所指出的那样,编译器必须遵守各种整数类型大小的某些关系,因此实现者不能自由选择任何东西。例如,int
不能大于long
,依此类推。
您经常谈论programming models与这些问题的关系,例如编译器可以根据所选模型选择使各种类型的大小不同。
答案 1 :(得分:9)
该标准仅要求:
int
不短于short
且不超过long
。它的大小可能与其中一个相同,或两者都不相同。整数类型的确切大小取决于编译器。 事实上的标准是
char
是8位short
是16位int
在16位系统上是16位,在32位和64位系统上是32位long
可以是32位或64位答案 2 :(得分:1)
这取决于架构,即你正在为(x86,ARM,PIC,Z80,8051等)和编译器编译代码的微处理器/微控制器,这就是编译器实现基础/内置的方式在数据类型中。
答案 3 :(得分:1)
保证short int
至少为16位,long int
至少为32位,而int
不小于{{1} }}也不大于short
。但实际大小将由编译器实现者决定。
答案 4 :(得分:1)
来自Bjarne的“The C ++编程语言”的4.4美元与char类似,每个整数类型有三种形式:''plain''int,signed int和unsigned int。另外,整数有三种大小:short int,'plain''int和long int。 long int可以称为plain long。类似地,short是short int的同义词,unsigned为unsigned int,签名为signed int。
无符号整数类型非常适合将存储视为位数组的用途。使用无符号而不是int来再获得一位来表示正整数几乎不是一个好主意。通过声明无符号变量来确保某些值为正的尝试通常会被隐式转换规则(第C.6.1节,§C.6.2.1)所取消。与普通字符不同,普通字符总是签名。 signed int类型只是它们的普通int对应物的更明确的同义词。
同一本书的第4.6节陈述
C ++对象的大小以char的大小的倍数表示,因此根据定义,char的大小为1。可以使用sizeof运算符
获取对象或类型的大小(§6.2)。这是有保证的 关于基本类型的大小:
1< = sizeof(char)< = sizeof(短)< = sizeof(int)< = sizeof(long)
1< = sizeof(bool)< = sizeof(长)
sizeof(char)< = sizeof(wchar_t)< = sizeof(long)
sizeof(float)< = sizeof(double)< = sizeof(long double)
sizeof(N)< = sizeof(带符号N)< = sizeof(无符号N)
其中N可以是char,short int,int, 或长int。另外,它是 保证char至少有8个 位,短至少16位,和a 长至少32位。一个炭可以举行 机器角色的一个角色 集。
这清楚地表明了这一点 sizeof(int)是实现定义的 但保证最低32位
C ++ 03 $ 3.9.1 / 3
“对于每个有符号整数类型, 存在相应的(但是 另外)无符号整数类型: “unsigned char”,“unsigned short int”, “unsigned int”和“unsigned long” int,“每个占据 相同的存储量和有 相同的对齐要求(3.9)as 相应的有符号整数 type40);也就是说,每个有符号整数 type具有相同的对象 表示为其对应的 无符号整数类型。
答案 5 :(得分:1)
C++ Standard这样说:
3.9.1,§2:
有五种有符号整数类型: “signed char”,“short int”,“int”, “long int”和“long long int”。在 这个列表,每种类型至少提供 与之前一样多的存储空间 在列表中。平原有 建议的自然尺寸 执行的架构 环境(44);另一个签了 提供整数类型以满足 特殊需要。
(44)即大到足以包含 INT_MIN和的范围内的任何值 INT_MAX,如标题中所定义
<climits>
结论:这取决于您正在进行的架构。任何其他假设都是错误的。