下面的代码将x设置为“无穷大”
#include <limits.h>
int x = INT_MAX;
当我说
int x = 3;
时,编译器正在为变量x分配一些内存资源。当我说int x = INT_MAX
时,编译器端发生了什么。 最佳答案
int
s不能有无穷大的值,因为int
s有一个固定的二进制大小。假设你有9位数字可以写任何你喜欢的数字。9位数是相当大的:它可以达到999999999;但是你不能用它来表示“无限”。
当今通用平台上的整数由32位组成,因此INT_MAX
扩展到二进制值0111 1111 1111 1111 1111 1111 1111 1111
,即231-1(略高于20亿)。(最后一位是符号位,不能用来使数字变大)。
为了回答您的实际问题,不管您输入的是整数,编译器总是为它分配相同的大小。
另一方面,浮点数是陌生的野兽,有一个特定的二进制模式来表示无穷大(或负无穷大)值。这是可能的,因为IEEE-794数字在内存中的表示方式:有一个符号位,一些指数位,然后是尾数。任何浮点数,无论是afloat
还是adouble
,都可以表示为±(位模式)x 2^(指数)。但是,对于“非数字”的值,也有特殊的位模式(对于非数字,也称为NaN),如0.0/0.0的结果;对于无穷大的值,也有特殊的位模式,如0除以0以外的任何数字的结果。(这不是数学上精确的,但这就是它的工作方式)如果我没记错的话,无限是用指数部分来表示它的最大值,但我可能错了。
请注意,这并不意味着你可以用浮点数存储任何数字。每一位的位数,“只有”2^64个可能的不同值可以用double
表示,这是一个疯狂的大数字,但仍然不是无限的。当你得到更大的数字(或者更精确的数字)时,你开始在你可以表示的值中看到“洞”。例如,在一个双精度的最大有限数和无穷常数之间有一个无穷步。
具有无穷大值的目的是提供一个常数,该常数必然比任何其他值都大(或在负无穷大的情况下更小)。从这个意义上说,尽管它听起来比INT_MAX
更令人印象深刻,但它做了几乎相同的事情。
就像INT_MAX
一样,它有一个常数,毫不奇怪,就是INFINITY
。
关于c - 将值无穷大存储到变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20504712/