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

时间:2011-09-17 18:23:47

标签: c++ c int long-integer

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

long long x = 0;

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

5 个答案:

答案 0 :(得分:29)

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

至于longint,它来自时间,标准整数是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 <= -32767INT_MAX >= +32767。 16位要求遵循这一点,并要求整数用二进制表示。

C99添加了<stdint.h><inttypes.h>,它们定义了uint32_tint_least32_tint_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)

longint的大小不同,至少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等类型直接设置整数的大小。