长 VS 整数 C/C + +-有什么意义?

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

long long x = 0;

但是为什么语言选择这样做,而不是仅仅使一个 long好... ... 长于一个 int?像 C # 这样的其他语言可以做到这一点,那么为什么不用 C/C + + 呢?

110578 次浏览

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

至于 longint,它来自时间,其中标准整数是16位,其中 long是32位整数-而且它确实 曾经是int长。

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

longint的大小不一样,至少int的大小一样。引用 C + + 03标准(3.9.1-2) :

有四种有符号整数类型: “有符号字符”,“短整数”, 在这个列表中,每个类型至少提供 与列表中前面的内容相比,它有更多的存储空间 执行架构所暗示的自然大小 其他有符号整数类型是为了满足特殊需要而提供的。

我对此的解释是“只要使用 int,但是如果由于某些原因不符合您的需要,并且您很幸运地找到了另一种更适合的整数类型,那么请随意使用这种类型。”。long可能更好的一个方法是,如果你在一个架构上,它是... 更长。

具体担保如下:

  • 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; 这些是 typedefs,通常定义为预定义类型的别名。

(不存在 必须的之间的直接关系的大小和范围。一个实现可以使 int为32位,但是只有一个范围,比如说,-2**23 .. +2^23-1,其他8位(称为 填充物)对值没有贡献。只要 long射程至少和 int一样宽,那么 int就有可能比 long大(但几乎不可能)。在实践中,很少有现代系统使用填充位,甚至除了2的补数以外的其他表示,但是标准仍然允许这种奇怪的现象。您更有可能在嵌入式系统中遇到奇特的特性。)

寻找一些完全不相关的东西,无意中发现了这个,需要回答。是啊,这是旧的,所以,人们谁冲浪后..。

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

Long 的大小是您的处理器一次可以操作的位数的大小。它也被称为“单词”。“半字”是短语。一个“ double word”是一个长的长的,是一个长的两倍大(最初只是由供应商实现,而不是标准) ,甚至比一个长的更大的是一个“四字”,是一个长的两倍大,但它没有正式的名称(并不是真正的标准)。

现在,整型数在哪里?部分寄存器在处理器上,部分操作系统上。您的寄存器定义了 CPU 处理的本机大小,而 CPU 处理的本机大小又定义了诸如短寄存器和长寄存器之类的东西的大小。处理器也被设计成数据大小,这是它操作的最有效的大小。应该是整型。

在今天的64位机器上,由于 long 是一个单词,而64位机器上的一个单词是64位,所以你可以假设 long 是64位,int 是处理器设计用来处理的,但它可能不是。为什么?操作系统已经选择了一个数据模型,并为您定义了这些数据大小(基本上是根据它的构建方式)。最终,如果你在 Windows 系统上(并且使用 Win64) ,它的 long 和 int 都是32位的。Solaris 和 Linux 使用不同的定义(long 为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 长指针,而 LLP 意味着 long-long 指针

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