MGZ*_*ero 30 c c++ int long-integer
正如我最近所了解的那样,C/C++中的长度与int的长度相同.简单地说,为什么?甚至在语言中包含数据类型似乎也毫无意义.它没有特定于int的特定用途吗?我知道我们可以像这样声明一个64位的int:
long long x = 0;
Run Code Online (Sandbox Code Playgroud)
但是为什么语言会选择这样做,而不仅仅是做得好......比int更长?其他语言如C#这样做,为什么不用C/C++呢?
Gri*_*wes 32
使用C或C++编写时,每种数据类型都是体系结构和编译器特定的.在一个系统int是32,但你可以找到它是16或64; 它没有定义,所以它取决于编译器.
至于long
和int
,它来自时间,标准整数是16位,其中long
是32位整数 - 它确实比...长int
.
Kei*_*son 31
具体保证如下:
char
是至少8位(根据定义,1字节,但它是多少位)short
至少是16位int
至少是16位long
至少是32位long long
(在支持它的语言版本中)至少为64位因此,long
如果您需要一个至少32位int
的类型,如果您需要一个相当快且至少16位的类型,则使用它是有意义的.
事实上,至少在C,这些下界在来表示范围,而不是大小.例如,语言要求INT_MIN <= -32767
,和INT_MAX >= +32767
.16位要求遵循此要求,并且要求整数以二进制表示.
C99添加<stdint.h>
和<inttypes.h>
,它定义类型,例如uint32_t
,int_least32_t
,和int_fast16_t
; 这些是typedef,通常定义为预定义类型的别名.
(在大小和范围之间不一定存在直接关系.一个实现可以产生int
32位,但是只有一个范围,比如说,-2**23 .. +2^23-1
其他8位(称为填充位)对该值没有贡献.理论上它是可能的(但实际上是极不可能的),其int
可能是大于long
,只要long
有至少宽范围的int
.在实践中,一些现代的系统使用填充位,甚至比二进制补码等交涉,但标准仍允许这样的怪事你更有可能在嵌入式系统中遇到奇特的功能.)
ars*_*enm 18
long与int的长度不同.根据规范,long至少与int一样大.例如,在带有GCC的Linux x86_64上,sizeof(long)= 8,sizeof(int)= 4.
Jon*_*Jon 13
long
是不一样的大小int
,这是至少相同的尺寸int
.引用C++ 03标准(3.9.1-2):
有四种带符号的整数类型:"signed char","short int","int"和"long int".在此列表中,每种类型至少提供与列表中前面的存储一样多的存储空间.简单的int具有执行环境的体系结构所建议的自然大小); 提供其他有符号整数类型以满足特殊需求.
我对此的解释是"只是使用int
,但如果由于某些原因不符合您的需求而您很幸运找到另一种更适合的整体类型,那就是我们的客人,而不是使用那个".一种long
可能更好的方法是,如果你在一个更长的架构上.
小智 6
寻找完全不相关的东西,偶然发现了这个,需要回答。是的,这是旧的,所以对于以后上网的人......
坦率地说,我认为这里的所有答案都不完整。
long 的大小是您的处理器一次可以操作的位数的大小。它也被称为“词”。“半字”是短句。“双字”是 long long 是 long 的两倍(最初仅由供应商实现而不是标准),甚至比 long long 更大的是“quadword”,其大小是 long long 的两倍但它没有正式名称(也不是真正的标准名称)。
现在, int 从哪里进来?部分注册在您的处理器上,部分注册在您的操作系统上。您的寄存器定义了 CPU 处理的本机大小,而这些大小又定义了短和长等内容的大小。处理器还设计有数据大小,这是它操作的最有效大小。那应该是一个int。
在今天的 64 位机器上,您会假设,由于 long 是一个字,而 64 位机器上的一个字是 64 位,那么无论处理器设计用于处理什么,long 都是 64 位和 int,但它可能不是。为什么?您的操作系统已经选择了一个数据模型并为您定义了这些数据大小(很大程度上取决于它的构建方式)。最终,如果您使用的是 Windows(并使用 Win64),则 long 和 int 都是 32 位。Solaris 和 Linux 使用不同的定义(长为 64 位)。这些定义被称为 ILP64、LP64 和 LLP64 之类的东西。Windows 使用 LLP64,Solaris 和 Linux 使用 LP64:
型号 ILP64 LP64 LLP64 内部 64 32 32 长 64 64 32 指针 64 64 64 长长 64 64 64
其中,例如,ILP 表示 int-long-pointer,而 LLP 表示 long-long-pointer
为了解决这个问题,大多数编译器似乎支持直接使用 int32 或 int64 等类型设置整数的大小。