int 限制与 long 限制

int limit vs long limit

大家都知道,intlong小。

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 之间有什么区别?怎么会?

这是 C++

On many (but not all) C and C++ implementations, a long is larger than an int. Today's most popular desktop platforms, such as Windows and Linux, run primarily on 32 bit processors and most compilers for these platforms use a 32 bit int which has the same size and representation as a long.

查看参考 http://tsemba.org/c/inttypes.html

您提到了 C++ 和 ASP.NET。两者差别很大

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

因此 long 实际上是 "sort-of-32-bit" 数据类型也就不足为奇了。这并不意味着 Linux 上的 C++ 实现(通常对 long 使用 64 位数字)是错误的,但它确实意味着为 Linux 编写的 C++ 应用程序假定long 是 64 位 错误。当然,将 C++ 应用程序移植到 Windows 时,这会很有趣。

要使用的标准 64 位整数类型是 long long,这是在 Windows.

上声明 64 位整数的标准方式

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

在 C 和 C++ 中,要求 int 至少可以容纳 16 位,long 至少可以容纳 32 位,并且 int 不能大于 long。没有要求 int 小于 long,尽管编译器通常以这种方式实现它们。没有人告诉你谎言,但有人告诉你过于简单化了。

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

但是,随着 32 位和 64 位 OS 的出现,据说一个整数由 32 位(4 个字节)和一个 long 组成'至少和整数一样大',因此又是 32 位。从而解释'int'和'long'可以取的最大和最小范围之间的相等性。

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