int limit vs long limit

时间:2016-06-16 08:27:56

标签: c++ int long-integer

每个人都知道这一点,int小于long

this MSDN link后面,我正在阅读以下内容:

INT_MIN (Minimum value for a variable of type int.)    –2147483648
INT_MAX (Maximum value for a variable of type int.)     2147483647

LONG_MIN (Minimum value for a variable of type long.)  –2147483648
LONG_MAX (Maximum value for a variable of type long.)   2147483647

可以找到相同的信息here

我一生都被告知过谎言吗? intlong之间有什么区别,如果不是它们可以容纳的值?怎么样?

4 个答案:

答案 0 :(得分:2)

你已经提到了C ++和ASP.NET。两者截然不同。

就C和C ++规范而言,您对原始数据类型唯一了解的是它可以存储的最大值范围。准备第一个惊喜 - int对应一系列[-32767; 32767]。今天大多数人都认为int是一个32位的数字,但它实际上只能保证能够存储16位数的等价数。另请注意,范围不是更典型的[-32768; 32767],因为C被设计为适用于各种平台的通用抽象机器,包括那些没有使用2的补码作为负数的平台。

因此long实际上是“32位排序”数据类型不应该令人惊讶。这并不意味着Linux上的C ++实现(通常使用long的64位数字)是错误的,但它确实意味着为Linux编写的C ++应用程序认为long是64-位 错误。当然,在将C ++应用程序移植到Windows时,这很有趣。

要使用的标准64位整数类型是long long,这是在Windows上声明64位整数的标准方法。

然而,.NET并不关心这些事情,因为它是根据自己的规范从头开始构建的 - 部分原因正是因为C和C ++的历史。在.NET中,int是32位整数,long是64位整数,long 总是大于{{1} }。在C中,如果你使用int(32位)并存储了一个十万亿的值,那么它有可能会起作用,因为你的long实际上可能是64位数字和C并不关心区别 - 这正是大多数Linux C和C ++编译器所发生的事情。由于类型是出于性能原因而定义的,因此编译器使用32位数据类型来存储8位值是完全合法的(在“优化性能”时请记住这一点 - 编译器是做自己的优化)。 .NET仍然可以在没有例如.NET的平台上运行32位2的补码整数,但运行时必须确保该类型可以容纳32位2的补码整数,即使这意味着采用下一个更大的类型(通常是“浪费”两倍的内存)。 / p>

答案 1 :(得分:1)

这是C ++

  

在许多(但不是全部)C和C ++实现中,long大于   一个int。今天最流行的桌面平台,如Windows和Windows   Linux主要运行在32位处理器和大多数编译器上   平台使用32位int,它具有相同的大小和表示   很长一段时间。

请参阅参考http://tsemba.org/c/inttypes.html

答案 2 :(得分:1)

在C和C ++中,要求int至少可以保留16位,long可以保存至少32位,int不能大于long }。虽然编译器通常以这种方式实现它们,但并不要求int小于long。你没有被告知谎言,但你被告知过于简单化了。

答案 3 :(得分:1)

不!嗯!就像我们从小就告诉我们的那样,东方的太阳升起,西方的太阳升起。 (太阳毕竟不动!)
在早期的处理环境中,我们有 16位操作系统,一个整数被认为是16位(2字节),一个'long'被认为是4个字节(32位)

但是,随着 32位和64位OS 的出现,一个整数被称为32位(4个字节),而一个长度为“至少 作为整数',因此,32位再次。从而解释了最大和最小范围'int'和'long'之间的相等性。

因此,这完全取决于您系统的架构