长 VS. 国际 C/C++ - 有什么意义?
Long Vs. Int C/C++ - What's The Point?
我最近了解到,C/c++中的long
与int
的长度相同。简单地说,为什么?甚至在语言中包含数据类型似乎都是毫无意义的。它有int
没有的特殊用途吗?我知道我们可以像这样声明64位的int
:
long long x = 0;
但是为什么语言选择这样做,而不是仅仅做一个long
好…比int
长吗?c#等其他语言可以做到这一点,那么为什么C/c++不行呢?
当用C或c++编写时,每个数据类型都是特定于体系结构和编译器的。在一个系统上,int是32,但你也可以找到它是16或64的;它没有定义,所以由编译器决定。
对于long
和int
来说,它来自于时间,其中标准整数是16位,long
是32位整数-并且确实比int
长
具体保证如下:
-
char
至少为8位(定义为1字节,不管它是多少位) -
short
至少为16位 -
int
至少为16位 -
long
至少为32位 -
long long
(在支持它的语言版本中)至少为64位 - 上述列表中的每种类型至少与前一种类型一样宽(但很可能是相同的)。
因此,如果你需要至少32位的类型,使用long
是有意义的,如果你需要至少16位的快速类型,使用int
。
实际上,至少在C中,这些下界是用范围表示的,而不是大小。例如,该语言要求INT_MIN <= -32767
和INT_MAX >= +32767
。16位的要求来自于此,也来自于整数用二进制表示的要求。
C99增加<stdint.h>
和<inttypes.h>
,分别定义了uint32_t
、int_least32_t
和int_fast16_t
等类型;这些是类型定义,通常定义为预定义类型的别名。
(大小和范围之间不一定有直接关系。实现可以使int
为32位,但范围仅为-2**23 .. +2^23-1
,而其他8位(称为填充位)不贡献值。理论上int
可能大于long
(但实际上非常不可能),只要long
的范围至少与int
一样宽。实际上,很少有现代系统使用填充位,甚至使用2补码以外的表示,但标准仍然允许这样的怪事发生。您更有可能在嵌入式系统中遇到奇异的特性。)
long与int类型的长度不同。根据规范,long至少和int一样大。例如,在使用GCC的Linux x86_64上,sizeof(long) = 8, sizeof(int) = 4。
long
与int
大小不同,至少与int
大小相同。引用c++ 03标准(3.9.1-2):
有四种有符号整数类型:" signed char ", " short int "," int "answers" long int "在此列表中,每种类型至少提供as比列表中前面的存储空间大。普通的int类型有执行的架构所建议的自然大小环境);其他有符号整数类型是为满足特殊需要而提供的。
我对此的解释是"只是使用int
,但如果出于某种原因不适合您的需求,并且您幸运地找到另一种更适合的积分类型,请成为我们的客人并使用该类型"。long
可能更好的一种方式是,如果你在一个架构上,它是……更长。
寻找一些完全不相关的东西,偶然发现了这个,需要回答。是的,这是旧的,所以对于那些以后上网冲浪的人…
坦率地说,我认为这里所有的答案都是不完整的。
long的大小是处理器一次可以操作的比特数的大小。它也被称为"word"。"half-word"是一个短词。"doubleword"是一个long,是一个long的两倍大(最初只是由供应商实现的,不是标准),甚至比long long更大的是一个"quadword",它是一个long long的两倍大,但它没有正式的名称(也不是真正的标准)。
int从哪里来?一部分在你的处理器上,一部分在你的操作系统上。你的寄存器定义了CPU句柄的本地大小,这反过来又定义了像short和long这样的东西的大小。处理器还设计了一个最有效的数据大小来进行操作。它应该是整型
在今天的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 LLP64Int 64 32 32长64 64 32指针64 64 64长64长64 64之前其中,例如,ILP表示int-long-pointer, LLP表示long-long-pointer
为了解决这个问题,大多数编译器似乎都支持使用int32或int64等类型直接设置整数的大小。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 什么时候在C++中返回常量引用是个好主意
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- C++避免重复声明的语法是什么
- c++库的公共头文件中应该包含什么
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- ifstream什么都没读
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 我应该使用什么来代替void作为变体中的替代类型之一
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用