【问题标题】:Storing value infinity to a variable将值无穷大存储到变量
【发布时间】:2013-12-10 20:37:58
【问题描述】:

以下代码会将 x 设置为“无穷大”

#include <limits.h>
int x = INT_MAX;

当我说int x = 3; 时,编译器正在为变量x 分配一些内存资源。当我说int x = INT_MAX;`时,编译器端发生了什么。

【问题讨论】:

  • The following code will set x as "infinity"谁说的?
  • 一模一样; INT_MAX 只是一个相当大的数字,但肯定不是无穷大。
  • INT_MAX 不是无穷大,它只是一个常数,给出了一个“int”变量可以容纳的最大数。基本上同样的事情发生在 X=3 和 X=INT_MAX
  • @self。哈哈..是的,我应该这样做..

标签: c compiler-construction


【解决方案1】:

这不会将值设置为无穷大。对于整数,没有可以表示无穷大的值。相反,它会将其设置为int 可以表示的最大值。

如果 int 恰好是一个 32 位整数,那么 INT_MAX == 2147483647

【讨论】:

    【解决方案2】:

    ints 不能有无穷大值,因为ints 具有固定的二进制大小。假设你有 9 位数字来写任何你喜欢的数字。 9 位相当大:最高可达 999,999,999;但是,您无法仅用它来表示“无限”。

    当今常见平台上的整数由 32 位组成,因此 INT_MAX 扩展为二进制值 0111 1111 1111 1111 1111 1111 1111 1111,即 231-1(略高于 20 亿)。 (最后一位是符号位,不能用来使数字变大)。

    为了回答您的实际问题,无论您在整数中输入的值如何,编译器总是为其分配相同的大小。

    另一方面,浮点数是陌生的野兽,并且具有特定的二进制模式来表示无穷大(或负无穷大)值。这是可能的,因为IEEE-794 数字在内存中的表示方式:有一个符号位,一些指数位,然后是尾数。任何浮点数,无论是float 还是double,都可以表示为±(位模式)x 2^(指数)。但是,对于“非数字”的值(也称为 NaN 表示非数字)也有特殊的位模式,例如 0.0 / 0.0 的结果,以及无穷大值的特殊位模式,例如除数字以外的任何数字的结果0 除以 0。(这在数学上并不精确,但这就是它的工作方式。)如果我没记错的话,无穷大是用指数部分取最大值来表示的,但我可能弄错了。

    请注意,这并不意味着您可以将任何数存储在浮点数中。根据位数,double 中“仅”有 2^64 个可能的不同值,这是一个疯狂的大数字,但仍然不是无限的。当您获得更大的数字(或只是更精确的数字)时,您开始在您可以表示的值中看到“漏洞”。例如,在你可以放入双精度数的最大有限数和无穷大常数之间有一个无限的步长。

    具有无穷大值的目的是提供一个常数,该常数必然大于(或在负无穷大的情况下小于)任何其他值。从这个意义上说,尽管它听起来比 INT_MAX 更令人印象深刻,但它的作用几乎相同。

    就像INT_MAX 一样,它有一个常数,不出所料,它是INFINITY

    【讨论】:

    • 感谢详细解答
    • Floating-point numbers, on the other hand, are stranger beasts, and have a specific binary pattern to represent the infinity (or negative infinity) value.你能详细说明一下吗..
    • 是的,我将编辑我的答案并提供更多信息。
    【解决方案3】:

    它不是将 int 设置为无穷大,而是将其设置为整数的最大值。 32 位操作系统为 2,147,483,647。它基本上存储了 31 个 1 和一个符号位。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-10
      • 2022-08-12
      • 1970-01-01
      • 2014-05-08
      • 2020-04-18
      • 2015-02-22
      相关资源
      最近更新 更多