正如我最近所了解的那样,C / C ++中的长度与int的长度相同。简单地说,为什么?甚至在语言中包含数据类型似乎也毫无意义。它没有特定于int的特定用途吗?我知道我们可以这样声明一个64位的int:
long long x = 0;
但是为什么语言会选择这样做,而不仅仅是做得好......比int更长?其他语言如C#这样做,为什么不用C / C ++?
答案 0 :(得分:29)
使用C或C ++编写时,每种数据类型都是体系结构和编译器特定的。在一个系统int是32,但你可以找到它是16或64;它没有定义,所以它取决于编译器。
至于long
和int
,它来自时间,标准整数是16位,其中long
是32位整数 - 而且确实是超过int
。
答案 1 :(得分:27)
具体保证如下:
char
至少为8位(根据定义为1个字节,无论多少位)short
至少为16位int
至少为16位long
至少为32位long long
(在支持它的语言版本中)至少为64位因此,如果您需要一个至少为32位的类型long
,如果您需要一个相当快且至少为16位的类型,则使用int
是有意义的。
实际上,至少在C中,这些下限用范围表示,而不是大小。例如,该语言需要INT_MIN <= -32767
和INT_MAX >= +32767
。 16位要求遵循这一点,并要求整数用二进制表示。
C99添加了<stdint.h>
和<inttypes.h>
,它们定义了uint32_t
,int_least32_t
和int_fast16_t
等类型;这些是typedef,通常定义为预定义类型的别名。
(必然大小与范围之间存在直接关系。实现可以使int
为32位,但仅限于-2**23 .. +2^23-1
,其他8位(称为填充位)对该值没有贡献。理论上可能(但实际上极不可能)int
可能大于long
,只要long
的范围至少与int
一样宽。实际上,很少有现代系统使用填充位,甚至是2位补码以外的表示,但标准仍然允许这样的奇怪。你更有可能在嵌入式系统中遇到奇特的功能。)
答案 2 :(得分:18)
long与int的长度不同。根据规范,long至少与int一样大。例如,在带有GCC的Linux x86_64上,sizeof(long)= 8,sizeof(int)= 4。
答案 3 :(得分:13)
long
与int
的大小不同,至少与int
的大小相同。引用C ++ 03标准(3.9.1-2):
有四种有符号整数类型:“signed char”,“short int”, “int”和“long int”。在此列表中,每种类型至少提供为 与列表中前面的存储一样多的存储空间。平原有 执行体系结构建议的自然大小 环境);提供其他有符号整数类型以满足特殊需求。
我对此的解释是“只使用int
,但如果由于某种原因不符合您的需求而您很幸运找到另一种更适合的整体类型,请成为我们的客人并使用该代替”。 long
可能更好的一种方法是,如果你的体系结构更长......
答案 4 :(得分:1)
寻找完全不相关的东西并偶然发现并需要回答。是的,这是旧的,所以对于后来冲浪的人来说......
坦率地说,我认为这里的所有答案都不完整。
long的大小是处理器一次可以操作的位数的大小。它也被称为“单词”。 “半字”是一个短片。 “双字”是一个很长的长,是一个长的两倍(最初只是由供应商实现而不是标准),甚至比一个长的长是一个“四字”,它是长长度的两倍但它没有正式的名称(并不是真正的标准)。
现在,int进来了哪里?部分寄存器位于处理器上,部分位于操作系统中。您的寄存器定义了CPU处理的本机大小,而这些大小又定义了short和long等大小。处理器的设计数据大小也是最有效的操作尺寸。那应该是一个int。
在今天的64位计算机上你会假设,因为长一字是64位机器上的一个字和一个字是64位,一个长就是64位和一个int无论处理器设计如何处理,但它可能不是。为什么?您的操作系统选择了一个数据模型并为您定义了这些数据大小(几乎就是它的构建方式)。最终,如果您使用的是Windows(并使用Win64),那么long和int都是32位。 Solaris和Linux使用不同的定义(长度为64位)。这些定义称为ILP64,LP64和LLP64。 Windows使用LLP64,Solaris和Linux使用LP64:
Model ILP64 LP64 LLP64 int 64 32 32 long 64 64 32 pointer 64 64 64 long long 64 64 64
其中,例如,ILP表示int-long-pointer,LLP表示long-long-pointer
为了解决这个问题,大多数编译器似乎都支持使用int32或int64等类型直接设置整数的大小。