use*_*729 19 c syntax integer long-integer
似乎所有这些都占用了4个字节的空间,
那有什么区别?
rlb*_*ond 25
首先,int/long的大小未指定.所以在你的编译器上,a int和a long可能是相同的,但这在编译器中并不普遍.
至于unsigned long和之间的区别long:
假设有4个字节,则a long的范围-2,147,483,648为2,147,483,647.无符号长整数的范围0为4,294,967,295.
另一个区别是溢出.对于签名类型,溢出具有未指定的行为.但对于无符号类型,溢出保证"环绕".
C语言规范允许int和long类型的实现在一些约束内从一个平台变化到另一个平台.这种可变性对于跨平台代码来说是一个令人头痛的问题,但它也是一种资产,因为它使得知情程序员能够在不同时提供硬件架构的本机处理器速度和完整数值范围之间平衡其设计目标.
通常,"int"应该映射目标CPU架构的机器的机器寄存器大小,因此对int类型数据的加载,存储和操作应该直接转换为使用目标处理器的本机寄存器的操作.
为了节省存储空间,Int可以小于机器寄存器大小(大的int占用RAM的两倍,而不是int).将int视为32位实体是很常见的,即使在64位体系结构中,与旧系统的兼容性和内存效率也是高优先级.
"long"可以与"int"相同或大于"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 long,并long很简单-上界。Signedlong从(在平均 32 位系统上)大约 -21 亿 (-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.