以下代码将x设置为“infinity”
#include <limits.h>
int x = INT_MAX;
当我说int x = 3;
时,编译器正在为变量x分配一些内存资源。当我说int x = INT_MAX
;`时,编译器端发生了什么。
答案 0 :(得分:8)
这不会将值设置为无穷大。对于整数,没有可以代表无穷大的价值。相反,它会将其设置为int
可以表示的最大值。
如果int
恰好是32位整数,那么INT_MAX == 2147483647
。
答案 1 :(得分:4)
int
s不能有无穷大值,因为int
具有固定的二进制大小。假设你有9位数字来写你喜欢的任何数字。 9位数字非常大:最高可达999,999,999;但是你无法用这种方式代表“无限”。
今天的通用平台上的整数由32位组成,因此INT_MAX
扩展为二进制值0111 1111 1111 1111 1111 1111 1111 1111
,即2 31 -1(略高于20亿) 。 (最后一位是符号位,不能用于使数字更大)。
要回答你的实际问题,无论你输入整数的值,编译器总是为它分配相同的大小。
另一方面,浮点数是陌生的野兽,并且具有特定的二元模式来表示无穷大(或负无穷大)值。这是可能的,因为IEEE-794数字在内存中的表示方式:有一个符号位,一些指数位,然后是一个尾数。任何浮点数,无论是float
还是double
,都可以表示为±(位模式)x 2 ^(指数)。但是,对于“非数字”(对于非数字也称为NaN)的值,也有特殊的位模式,如0.0 / 0.0的结果,以及无穷大值的特殊位模式,如除了数字以外的任何数字的结果0除以0.(这在数学上并不精确,但这就是它的工作方式。)如果我没记错的话,无穷大的代表是将指数部分设为最大值,但我可能会弄错。
请注意,这并不意味着您可以将任何号码存储在浮点数中。根据比特数,“{only”2 ^ 64个可能的不同值可以用double
表示,这是一个疯狂的大数,但仍然不是无限的。当您获得更大的数字(或更精确的数字)时,您会开始在您可以表示的值中看到“漏洞”。例如,你可以放入双倍的最大有限数和无穷大常数之间有一个无限的步骤。
具有无穷大值的要点是提供一个常数,该常数必须比任何其他值更大(或在负无穷大的情况下更小)。从这个意义上讲,即使它听起来比INT_MAX
更令人印象深刻,但它确实做了同样的事情。
就像INT_MAX
一样,它有一个常量,不出所料,INFINITY
。
答案 2 :(得分:1)
没有将int设置为无穷大,它将其设置为整数的最大值。对于32位OS,2,147,483,647。它基本上存储了31个1和一个符号位。