当大小相同时,float 和 integer 数据类型有什么区别?

新手上路,请多包涵

当大小相同时,浮点数和整数数据类型有什么区别?

原文由 akk 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 526
1 个回答
  • float 存储浮点值,即具有潜在小数位的值
  • int 只存储整数值,即整数

因此,虽然两者都是 32 位宽,但它们的用途(和表示)却大不相同。您不能将 3.141 存储在整数中,但可以存储在 float 中。

进一步剖析它们:

在整数中, 所有 位都用于存储数字值。这是(在 Java 和许多计算机中)以所谓 的二进制补码 完成的。这基本上意味着您可以表示 −2 31到 2 31 − 1 的值。

在浮点数中,这 32 位分为三个不同的部分:符号位、指数和尾数。它们的布局如下:

 S EEEEEEEE MMMMMMMMMMMMMMMMMMMMMMM

有一个位确定数字是负数还是非负数(零既不是正数也不是负数,但符号位设置为零)。然后有 8 位指数和 23 位尾数。为了从中获得有用的数字,(大致)执行以下计算:

× 2

(还有更多内容,但这足以满足本次讨论的目的)

尾数本质上不过是一个 24 位整数。这会乘以 2 的指数部分的幂,大致来说,它是一个介于 −128 和 127 之间的数字。

因此,您可以准确地表示适合 24 位整数的所有数字,但数字范围也更大,因为指数越大,值越大。例如,a float 的最大值约为 3.4 × 10 38而 int 只允许最大 2.1 × 10 9的值。

但这也意味着,由于 32 位只有 4.2 × 10 9 个不同的状态(它们都用于表示值 int 可以存储),因此在 float 的较大端s 数值范围 数字之间的间隔更宽(因为唯一的 float 数字不能比唯一的 int 数字多)。那么你不能准确地表示一些数字。例如,数字 2 × 10 12在 float 中表示为 1,999,999,991,808。这可能 接近 2,000,000,000,000,但并不准确。同样,将 1 添加到该数字不会改变它,因为 1 太小而无法在更大的尺度上产生差异 float 正在那里使用。

同样,您也可以在 float 中表示非常小的数字(介于 0 和 1 之间),但无论数字是非常大还是非常小, float 的精度仅为大约6 位或 7 位十进制数字。如果你有大数字,这些数字位于数字的开头(例如 4.51534 × 10 35 ,无非是 451534 后跟 30 个零 - 并且 float 无法说明这 30 个数字是否有用实际上是零或其他东西),对于非常小的数字(例如 3.14159 × 10 −27 ),它们位于数字的远端,远远超出 0.0000 的起始数字…

原文由 Joey 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题