Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';s c/c+中无符号long/long/int之间的差异+;?_C_Syntax_Integer_Long Integer - Fatal编程技术网

什么';s c/c+中无符号long/long/int之间的差异+;?

什么';s c/c+中无符号long/long/int之间的差异+;?,c,syntax,integer,long-integer,C,Syntax,Integer,Long Integer,看起来它们都占用了4字节的空间 那么有什么区别呢?首先,int/long的大小是未指定的。因此,在编译器上,int和long可能是相同的,但这在编译器中并不通用 至于无符号long和long之间的区别: 假设有4个字节,long的范围为-2147483648到2147483647。无符号long的范围为0到4294967295 另一个区别是溢出。对于签名类型,溢出具有未指定的行为。但是对于无符号类型,溢出保证是“环绕的”。那么,无符号long和long之间的区别很简单——上界。有符号的long从

看起来它们都占用了4字节的空间


那么有什么区别呢?

首先,int/long的大小是未指定的。因此,在编译器上,
int
long
可能是相同的,但这在编译器中并不通用

至于
无符号long
long
之间的区别:

假设有4个字节,
long
的范围为
-2147483648
2147483647
。无符号long的范围为
0
4294967295


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

那么,
无符号long
long
之间的区别很简单——上界。有符号的
long
从(在平均32位系统上)大约-21亿(-2^31)到+21亿(+2^31-1),而
无符号的long
从0到42亿(2^32-1)

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


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

C语言规范允许int和long类型的实现在几个约束条件下随平台的不同而变化。这种可变性对于跨平台代码来说是一个头痛的问题,但它也是一项资产,因为它使知情的程序员能够在本机处理器速度和硬件体系结构上的全数字范围之间平衡他们的设计目标,而硬件体系结构不能同时提供这两种功能

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

为了节省内存空间,Int可以小于机器寄存器大小(大Int占用的RAM是小Int的两倍)。即使在64位体系结构上,与旧系统的兼容性和内存效率都是优先考虑的问题,通常也会将int视为32位实体

根据目标体系结构的寄存器大小,“long”可以等于或大于“int”。如果目标体系结构不支持其本机寄存器中如此大的值,则可以在软件中实现对“long”的操作

如今,为节能或嵌入式设备设计的CPU芯片会让你发现int和long之间的区别。台式机或笔记本电脑等通用CPU的编译器通常将int和long视为相同的大小,因为CPU有效地使用32位寄存器。在较小的设备(如手机)上,CPU可以更自然地处理16位数据,并且必须努力处理32位或更大的数据

每个寄存器更少的位意味着芯片上所需的电路更少,将数据移入和移出芯片所需的数据线更少,功耗更低,芯片芯片尺寸更小,所有这些都使得设备成本更低(以美元和瓦特为单位)

在这样的体系结构中,您很可能会发现int的大小为16位,long的大小为32位。使用long也可能会带来性能损失,原因可能是等待状态通过16位数据总线多次读取加载32位,或者如果本机硬件不支持硬件中的长操作(加法、减法等),则在软件中实现长操作

一般来说,关于int和long,唯一可以假设的是int的范围在任何体系结构上都应该小于或等于long。您还应该假设有一天您的代码将被重新编译为一个不同的体系结构,在这个体系结构中,您当前看到的int和long之间的任何关系都不再存在


这就是为什么即使在日常的普通编码中,也应该小心地将整数与长分开。今天,它们可能完全兼容分配,因为它们在当前硬件平台上的实现细节是一致的,但并非所有平台都能保证这种一致性。

无论是什么系统,
int
long
都具有相同的长度——基字大小。对吗?不,一点也不。在旧的16位编译器上,int通常为2字节,long为4字节。对于尺寸,这里没有硬性规定,只有相对的规定。char总是小于或等于short,它总是小于或等于int,它总是小于或等于long。从技术上讲,你可以遵守C++标准,并且所有的四个都是一个字节。使用限制。H或Stdit.h帮助你。如果您知道需要32位值,请使用stdint.h中的int32_t,而不是int或long。这样,无论您将代码移植到何处,它都将始终为32位。标准C要求int至少为16位,long至少为32位。然而,现在有了stdint.h,它定义了int_fast16_t=一种至少16位(但可能更多)的有符号整数类型,并在目标平台上定义为“快”(例如,在现代计算机上通常为32位)。如果您对尺寸有特殊要求,则应使用这些类型。参见例如维基百科上的stdint.h和limits.h。环绕处理为