长 VS. 国际 C/C++ - 有什么意义?

Long Vs. Int C/C++ - What's The Point?

本文关键字:什么 C++ VS 国际      更新时间:2023-10-16

我最近了解到,C/c++中的longint的长度相同。简单地说,为什么?甚至在语言中包含数据类型似乎都是毫无意义的。它有int没有的特殊用途吗?我知道我们可以像这样声明64位的int:

long long x = 0;

但是为什么语言选择这样做,而不是仅仅做一个long好…比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 <= -32767INT_MAX >= +32767。16位的要求来自于此,也来自于整数用二进制表示的要求。

C99增加<stdint.h><inttypes.h>,分别定义了uint32_tint_least32_tint_fast16_t等类型;这些是类型定义,通常定义为预定义类型的别名。

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

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 "answers" long int "在此列表中,每种类型至少提供as比列表中前面的存储空间大。普通的int类型有执行的架构所建议的自然大小环境);其他有符号整数类型是为满足特殊需要而提供的。

我对此的解释是"只是使用int,但如果出于某种原因不适合您的需求,并且您幸运地找到另一种更适合的积分类型,请成为我们的客人并使用该类型"。long可能更好的一种方式是,如果你在一个架构上,它是……更长。

寻找一些完全不相关的东西,偶然发现了这个,需要回答。是的,这是旧的,所以对于那些以后上网冲浪的人…

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

long的大小是处理器一次可以操作的比特数的大小。它也被称为"word"。"half-word"是一个短词。"doubleword"是一个long,是一个long的两倍大(最初只是由供应商实现的,不是标准),甚至比long long更大的是一个"quadword",它是一个long long的两倍大,但它没有正式的名称(也不是真正的标准)。

int从哪里来?一部分在你的处理器上,一部分在你的操作系统上。你的寄存器定义了CPU句柄的本地大小,这反过来又定义了像short和long这样的东西的大小。处理器还设计了一个最有效的数据大小来进行操作。它应该是整型

在今天的64位机器上,你会认为,因为long是一个字,而64位机器上的字是64位的,所以long应该是64位的,而int应该是处理器设计来处理的,但它可能不是。为什么?您的操作系统已经选择了一个数据模型,并为您定义了这些数据大小(很大程度上取决于它是如何构建的)。最终,如果你使用的是Windows(并且使用Win64),那么long和int类型都是32位的。Solaris和Linux使用不同的定义(长度为64位)。这些定义被称为ILP64、LP64和LLP64。Windows使用LLP64, Solaris和Linux使用LP64:

<>之前型号ILP64 LP64 LLP64Int 64 32 32长64 64 32指针64 64 64长64长64 64之前

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

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