int 限制与 long 限制
int limit vs long limit
大家都知道,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
之间有什么区别?怎么会?
这是 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.
您提到了 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'可以取的最大和最小范围之间的相等性。
因此,这完全取决于您系统的架构。
大家都知道,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
之间有什么区别?怎么会?
这是 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.
您提到了 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.
但是,.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'可以取的最大和最小范围之间的相等性。
因此,这完全取决于您系统的架构。