很长的 Int C / C ++ – 重点是什么?

正如我最近所了解的那样,C / C ++中的长度与int的长度相同。 简单地说,为什么? 甚至在语言中包含数据类型似乎也毫无意义。 它没有特定于int的特定用途吗? 我知道我们可以像这样声明一个64位的int:

long long x = 0; 

但是为什么语言选择这样做,而不仅仅是做得好……比int更长? 其他语言如C#这样做,为什么不用C / C ++呢?

使用C或C ++编写时,每种数据类型都是体系结构和编译器特定的。 在一个系统int是32,但你可以找到它是16或64; 它没有定义,所以它取决于编译器。

至于longint ,它来自时间,标准整数是16位,其中long是32位整数 – 它确实比int

具体保证如下:

  • 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添加了 ,它们定义了诸如uint32_tint_least32_tint_fast16_t ; 这些是typedef,通常定义为预定义类型的别名。

(大小和范围之间不一定存在直接关系。一个实现可以使int 32位,但只有一个范围,比如-2**23 .. +2^23-1 ,其他8位(称为填充位 )对该值没有贡献。理论上可能(但实际上极不可能) int可以大于long ,只要long至少与int范围一样宽。实际上,很少有现代系统使用填充比特,甚至是2的补码以外的表示,但标准仍然允许这样的奇怪。你更有可能在嵌入式系统中遇到奇特的function。)

long与int的长度不同。 根据规范,long至少与int一样大。 例如,在带有GCC的Linux x86_64上,sizeof(long)= 8,sizeof(int)= 4。

longint大小不同,它至少int大小相同。 引用C ++ 03标准(3.9.1-2):

有四种带符号的整数类型:“signed char”,“short int”,“int”和“long int”。在此列表中,每种类型至少提供与列表中前面的存储一样多的存储空间。 简单的int具有执行环境的体系结构所建议的自然大小); 提供其他有符号整数类型以满足特殊需求。

我对此的解释是“只是使用int ,但如果由于某种原因不符合您的需求而您很幸运找到另一种更适合的整体类型,那就是我们的客人并使用那个”。 long可能更好的一种方法是,如果你在一个更长的架构上。

寻找完全无关的东西,偶然发现并需要回答。 是的,这是旧的,所以对于后来冲浪的人来说……

坦率地说,我认为这里的所有答案都是不完整的。

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:

型号ILP64 LP64 LLP64
 int 64 32 32
长64 64 32
指针64 64 64
长64 64 64

其中,例如,ILP表示int-long-pointer,LLP表示long-long-pointer

为了解决这个问题,大多数编译器似乎都支持使用int32或int64等类型直接设置整数的大小。