c / c ++中unsigned long / long / int之间有什么区别?

似乎所有这些都占用了4个字节的空间,

那有什么区别?

首先,未指定int / long的大小。 所以在你的编译器上, intlong可能是相同的,但这在编译器中并不普遍。

至于unsigned longlong之间的区别:

假设有4个字节,则long的范围为-2,147,483,6482,147,483,647 。 无符号长4,294,967,295的范围为04,294,967,295

另一个区别是溢出。 对于签名类型,溢出具有未指定的行为。 但对于无符号类型,溢出保证“环绕”。

C语言规范允许int和long类型的实现在一些约束内从一个平台变化到另一个平台。 这种可变性对于跨平台代码来说是一个令人头痛的问题,但它也是一种资产,因为它使得知情程序员能够在不同时提供硬件体系结构的本机处理器速度和完整数值范围之间平衡其设计目标。

通常,“int”应该映射目标CPU体系结构的机器的机器寄存器大小,因此对int类型数据的加载,存储和操作应该直接转换为使用目标处理器的本机寄存器的操作。

为了节省存储空间,Int可以小于机器寄存器大小(大的int占用RAM的两倍,而不是int)。 将int视为32位实体是很常见的,即使在64位体系结构中,与旧系统的兼容性和内存效率也是高优先级。

“long”可以与“int”相同或更大,具体取决于目标体系结构的寄存器大小。 如果目标体系结构不支持其本机注册中较大的值,则可以在软件中实现“长”操作。

专为提高功效或嵌入式设备而设计的CPU芯片可以在这些日子里找到int和long之间的区别。 用于通用CPU的编译器(如台式机或笔记本电脑)通常将int和long视为相同的大小,因为CPU有效地使用32位寄存器。 在诸如蜂窝电话的较小设备上,CPU可以被构建为更自然地处理16位数据并且必须努力处理32位或更大的数据。

每个寄存器的位数减少意味着芯片所需的电路更少,数据进出芯片的数据线更少,功耗更低,芯片尺寸更小,所有这些都可以降低成本(以美元和瓦特为单位) 。

在这样的体系结构中,您很可能会发现int的大小为16位,长度为32位。 使用long可能会导致性能损失,这是由于等待状态在16位数据总线上的多次读取中加载32位所导致的,或者是由于在本机软件中实现长操作(加法,减法等)引起的硬件不支持硬件中的此类操作。

作为一般规则,你可以假设关于int和long的唯一事情是int的范围在任何架构上应该总是小于或等于long。 您还应该假设有一天您的代码将被重新编译为不同的体系结构,其中您当前在int和long之间看到的任何关系不再存在。

这就是为什么即使在日常平凡的编码中你也应该小心保持与long不同的内容。 它们今天可能完全兼容,因为它们当前硬件平台的实现细节很重合,但并非所有平台都能保证这种巧合。

好吧, unsigned longlong之间的区别long简单 – 上限。 签名long (从平均32位系统)大约-2.1亿(-2 ^ 31)到+ 21亿(+ 2 ^ 31 – 1), unsigned long从0到42亿(2 ^ 32 – 1)。

碰巧在许多编译器和操作系统(包括显然是你的)上, int也是一个32位的值。 但是C ++标准并没有确定任何这些类型的最大宽度,只有最小宽度。 在某些系统上, int是16位。 在某些系统上, long为64位。 其中很大程度上取决于目标处理器架构以及基本字大小。

header limits.h用于定义当前编译环境下各种类型的最大容量, stdint.h用于提供与环境无关的保证宽度类型,例如int32_t