C有一个类型long。根据:Wiki c-types会在内存中占用4个字节,其取值范围与int. 那为什么需要呢?
维基摘录:
int:
有符号整数的基本类型。可以包含 [−32767, +32767] 范围内的数字。range;[3][4] 所以它至少是 16 位(2 字节)。实际上,在所有现代编译器中,它的大小为 4 个字节,范围为 [-2147483648, +2147483647]
long:
有符号长整型。可以包含至少在 [−2 147 483 647, +2 147 483 647].[3][4] 范围内的数字 所以它至少是 32 位(4 字节)。
类型的大小
int不受long语言标准的约束。但是它们的大小比例是有规定的,即sizeof(int)<=sizeof(long)。目前,我们可以说大小
long取决于处理器的位数和所使用的操作系统。例如,对于 Linux 和 MacOS,64 位架构为 8 个字节,32 位架构为 4 个字节。在 Windows 上,无论体系结构的位数如何,大小都是 4 个字节。例如,C++ 标准甚至有这个例子:
例如,您可以使用不同的类型来提供函数重载:
另外,不要忘记这些类型具有不同的等级(整数转换等级),这会影响转换整数类型的规则。
在来自cygwin 页面的@AnT
long的评论之后对维度的澄清:处理器的发展逐渐增加了寄存器的容量。例如,之前的
DOS类型int对应于 16 位整数值,因为在 IBM 兼容计算机上寄存器是 16 位的。例如,一个寄存器AX的长度为 16 位,其子寄存器AL的AH位宽为 8 位。在此之前,一般来说,处理器寄存器都是 8 位的。例如,如果您执行两个 16 位类型的对象的乘法运算
int,那么您需要使用两个寄存器来存储结果,例如寄存器AX和DX。对于这个结果,您已经需要引入一个新的整数类型。并引入了这种类型。这是类型long。然后是 64 位处理器。您必须区分 16 位整数、32 位整数和 64 位整数。因此,引入了一个额外的整数类型
Long long。请记住,有必要保持与先前为具有较低位深度的处理器引入的整数类型的向后兼容性。因此,C 标准假定
long编译器开发人员可以自由选择类型和其他整数类型的位宽。比如一个类型的位宽long可能不是`32位,而是64位。为了使程序可移植,有必要引入具有严格指定位深度的新类型,例如 int_least32_t 或 int32_t。
在某些 64 位平台上,type
long和 typelong long可能是 64 位宽的。在其他 64 位平台上,typelong可以是 32 位,typeint也可以是 32 位,type 可以是long long64 位。但是,type
long long的等级大于 type 的等级long,而 typelong的等级又高于 typeint。表达式中类型转换的规则就是基于此。例如,如果 type
long和 typeint都是 32 位宽,那么在下面的代码片段中表达式
x + y的类型是 类型unsigned long。在这方面,有一些与此类转换相关的好奇心,尤其是在选择 C++ 中的重载函数时。
下面的主题描述了一个这样的例子,在接近尾声的地方(您可以通过关键字快速找到这篇文章
int64_t)描述了一个这样的好奇心,它与调用参数类型为 的重载函数有关std::int64_t,当它变成out,不是 type 的别名long long int,而是 type 的别名,long int在此平台上是 64 位的。该类型
long不会“占用内存中的 4 个字节”。它至少需要 32 位,即 范围至少为[−2147483647, +2147483647]. 从上面看,它的大小不受限制。该类型
int至少需要 16 位,因为它至少有一个范围[−32767, +32767](正如您自己注意到的)。因此,尚不完全清楚您从哪里得到这些类型的范围相同的假设 - 从您引用的内容中可以清楚地看出它们很容易不同。
在 C++ 中,整数类型系统具有以下属性
那些。这些类型的大小(和范围)很可能都不同。
在 C 语言中,由于某些历史原因,这个比率被定义为
但是,当然,这两种情况的想法是相同的。所有这些类型在范围方面都可能不同。但是,因为它们在大小和范围方面都可以相同。
事实上,在某些平台上,您具有
long与该类型相同的类型表示,这int只是您平台的一个特性。C 语言为您提供了许多类型。特别是,保证 int 不大于 long。并且 long 不大于 long long。您可以根据自己的需要和方便进行选择。
当一个类型被频繁使用时,编译器会针对它进行优化。在编译器中进行优化后,他们开始推荐出于某种目的使用该类型。
在不同的计算机体系结构上,处理器寄存器的大小不同,但类型大小的比例保持不变。
简单来说:在程序中经常使用int,所以在PC上被拉长到4字节大小,对应x32处理器寄存器。long 并没有开始提取最多 8 个字节,因为在 x32 上,需要向处理器发送两条命令而不是一条。但是不要删除long,因为有些程序会用到它。