我正在阅读CS:APP,关于强制类型转换,它说当从int转换为float时,数字不能溢出,但可能会四舍五入。这让我感到奇怪,因为我不知道有什么需要四舍五入的,所以我尝试了一下。我认为这只会发生在非常大的整数(接近INT_MAX / INT_MIN)的情况下,但是在约一亿左右的值处也会发生舍入(不确定具体值在哪里)。为什么会这样呢?float的范围远远超过int。有人可能会说浮点数无法被精确表示,但是当从int转换为double时,其值不会改变。 double比float具有更大的范围和精度的优势。但是float仍然具有足够的范围来“封装”整数,并且精度实际上并不重要,因为整数没有小数位(全为0),或者我想错了吗?
这是我得到的一些输出(代码在这里:http://pastebin.com/K3E3A6Ni):
FLT_MAX = 340282346638528859811704183484516925440.000000
INT_MAX = 2147483647
(float)INT_MAX = 2147483648.000000
(double)INT_MAX = 2147483647.000000
INT_MIN = -2147483648
(float)INT_MIN = -2147483648.000000
====other values close to INT_MIN INT_MAX====
INT_MAX-1 = 2147483646
(float)INT_MAX-1 = 2147483648.000000
INT_MIN+1 = -2147483647
(float)INT_MIN+1 = -2147483648.000000
INT_MAX-2 = 2147483645
(float)INT_MAX-2 = 2147483648.000000
INT_MAX-10 = 2147483637
(float)INT_MAX-10 = 2147483648.000000
INT_MAX-100 = 2147483547
(float)INT_MAX-100 = 2147483520.000000
INT_MAX-1000 = 2147482647
(float)INT_MAX-1000 = 2147482624.000000
(float)1.234.567.809 = 1234567808.000000
(float)1.234.567.800 = 1234567808.000000
(float)1.000.000.005 = 1000000000.000000
(float)800.000.003 = 800000000.000000
(float)500.000.007 = 500000000.000000
(float)100.000.009 = 100000008.000000
2147483647.0f == 2147483648.0f
- dmg