大家都知道,int比long小。
在此MSDN链接后面,我读到了以下内容:
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同样的信息可以找到这里。
我一辈子都被人骗了吗?如果int和long不能保存它们的值,那么它们之间有什么区别呢?怎么会这样?
发布于 2016-06-16 08:41:16
你已经提到了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总是比int大。在C中,如果您使用long (32位)并在其中存储一个类似10万亿的值,那么它就有可能起作用,因为您的long可能实际上是一个64位的数字,而C并不关心区别--这正是大多数Linux和C++编译器上发生的情况。由于出于性能原因,这些类型的定义是这样的,所以编译器使用32位数据类型存储8位值是完全合法的(在“优化性能”时--编译器自己正在进行优化)。.NET仍然可以在没有32位2的补码整数的平台上运行,但是运行时必须确保该类型可以容纳32位2的补码整数,即使这意味着采用下一种更大的类型(通常“浪费”两倍多的内存)。
发布于 2016-06-16 12:28:37
在C和C++中,要求int至少可以容纳16位,long可以容纳至少32位,而int不能超过long。不需要int比long小,尽管编译器通常以这种方式实现它们。你没有被骗,但你被告知过于简单化了。
发布于 2016-06-16 08:30:47
我是C++
在许多(但不是全部)C和C++实现上,long大于int。当今最流行的桌面平台,如Windows和Linux,主要运行在32位处理器上,而这些平台的大多数编译器使用32位int,其大小和表示形式与long相同。
参见参考文献http://tsemba.org/c/inttypes.html
https://stackoverflow.com/questions/37853811
复制相似问题