每个人都知道这一点,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。
我一生都被告知过谎言吗? int
和long
之间有什么区别,如果不是它们可以容纳的值?怎么样?
答案 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,它具有相同的大小和表示 很长一段时间。
答案 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'之间的相等性。
因此,这完全取决于您系统的架构。