事实上,float 和 int 都使用 32 位表示。整数值使用所有 32 位,因此它可以容纳从 -231 到 231-1 的数字。但是,浮点数使用 1 位作为符号(包括 -0.0f)和 8 位作为指数。意味着尾数剩下 32 - 9 = 23 位。但是,浮点数假设如果尾数和指数不为零,则尾数以 1 开头。因此,您的整数或多或少有 24 位,而不是 32 位。但是,因为它可以移动,它可以容纳更多超过 224 个整数。
A floating point uses a Sign, an eXponent, and a Mantissa
S X X X X X X X X M M M M M M M M M M M M M M M M M M M M M M M
An integer has a Sign, and a Mantissa
S M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M
所以,一个 29 位整数,例如:
0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
适合浮动,因为它可以移动:
0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
| | |
| +-----------+ +-----------+
| | |
v v v
S X X X X X X X X M M M M M M M M M M M M M M M M M M M M M M M
0 1 0 0 1 1 0 1 1 1 1 1 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0
指数表示有偏差的移位(尾数的移位减去 128,如果我是正确的,移位从小数点开始计算)。这清楚地向您表明,如果您必须移动 5 位,您将丢失低 5 位。
因此,这个其他整数可以转换为丢失 2 位的浮点数(即,当您转换回整数时,最后两位 (11) 设置为零 (00),因为它们没有保存在浮动):
1 1 1 0 0 1 1 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1
| ||
| || complement
| vv
| 0 0 1 1 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1
| | | | | | | |
| +-----------+ +-----------+ +-+-+-+-+--> lost bits
| | |
v v v
S X X X X X X X X M M M M M M M M M M M M M M M M M M M M M M M
1 1 0 0 1 1 0 1 1 1 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 1 1 1 1 1 1 1
注意:对于负数,我们首先生成补码,即减1,然后将所有位从0反转为1。即补码 em> 是保存在尾数中的内容。但是,该标志仍会按原样复制。
真的很简单。
重要提示:是的,整数中的第一个 1 是符号,然后尾数中不复制下一个 1,假定为 1,因此不需要。 p>