Assembly 浮点数是如何存储在CPU中的?
我是一名初学者,正在学习组装基础知识。现在读这篇文章时,我想到了这一段。它解释了浮点数是如何存储在内存中的 浮点的指数是一个8位字段。允许大量或 如果要存储较小的数字,则指数被解释为正或负 消极的实际指数是8位字段的值减去127。 127是32位浮点数的“指数偏差”。 浮点数的分数域有一个小惊喜。因为定义了0.0 由于所有位都设置为0,因此无需担心将0.0表示为0 指数字段等于127,分数字段设置为所有O。所有其他 数字至少有一个1位,因此IEEE 754格式使用隐式1 位以节省空间。因此,如果分数字段为00000000000000000,则 被解释为1。00000000000000000000000. 这允许分数 字段的有效长度为24位。这是一个聪明的把戏,由 使OxOO和OxFF的指数字段特殊 我一点也不明白Assembly 浮点数是如何存储在CPU中的?,assembly,floating-point,ieee-754,Assembly,Floating Point,Ieee 754,我是一名初学者,正在学习组装基础知识。现在读这篇文章时,我想到了这一段。它解释了浮点数是如何存储在内存中的 浮点的指数是一个8位字段。允许大量或 如果要存储较小的数字,则指数被解释为正或负 消极的实际指数是8位字段的值减去127。 127是32位浮点数的“指数偏差”。 浮点数的分数域有一个小惊喜。因为定义了0.0 由于所有位都设置为0,因此无需担心将0.0表示为0 指数字段等于127,分数字段设置为所有O。所有其他 数字至少有一个1位,因此IEEE 754格式使用隐式1 位以节省空间。因此,如果
你能解释一下它们是如何存储在内存中的吗?我不需要参考资料,我只需要一个好的解释,这样我就可以很容易地理解。浮点数紧随其后。他们一直在使用这套规则,主要是因为浮点数可以(相对)轻松地与整数和其他浮点数进行比较 浮点有两种常见版本:32位()和64位()。它们之间的唯一区别是字段的大小:
- 指数:32位为8位,64位为11位
- 尾数:32位为23位,64位为52位
12375
base 10(32位)为例:
- 第一步是将此数字转换为基数2:
这很简单,经过一些计算后,您将得到:
1100.011
- 接下来,您必须移动“逗号”,直到得到
(直到1.100011
前面的唯一数字是1)。我们移动逗号多少次?3,这是指数。这意味着我们的数字可以表示为
。(它不是小数点,因为它是二进制的。它是“基数点”或“二进制点”。) 移动1.100011*2^3
(并用指数计算这些移动),直到尾数以前导
称为“规范化”。一个太小而不能用这种方式表示的数(指数的有限范围)称为次正规数或非正规数1开始。
- 之后,我们必须将偏差添加到指数中。对于32位浮点中的8位指数字段,这是127。我们为什么要这样做?答案是:因为这样我们可以更容易地比较浮点和整数。(将FP位模式作为整数进行比较会告诉您哪一个具有更大的幅度,如果它们具有相同的符号。)此外,增加位模式(包括从尾数到指数的进位)会将幅度增加到下一个可表示的值。(
) 如果我们不这样做,负指数将使用两个补码表示法表示,基本上是在最高有效位加1。但在这种情况下,较小的浮点似乎比正指数浮点更大。出于这个原因:我们只需添加127,使用这个小“技巧”,所有正指数从nextafter()
base 2(以1为基数10)开始,而负指数最多达到10000000
base 2(以-1为基数10)0111110
1000010
base 2
- 最后一件事是在指数之后添加mantix(
),结果是:.100011
01000001010001100000000000000000 | exp || mantix |
这是一个简单的版本,这是一个良好的开端。它简化了,省去了:
- 非数字NaN(有偏指数=所有1;尾数!=0)
- +-无穷大(有偏指数=所有1;尾数=0)
- 也没有说太多关于次正常值的数字(偏差指数=0意味着尾数中的前导0而不是正常值1)
IEEE-754甚至定义了一些十进制浮点格式,使用10^exp精确表示十进制分数而不是二进制分数。(硬件支持有限,但确实存在)。与小学数学没有什么不同。我们在小学就学会了先做正整数,然后加,减。然后我们学会了做一个水平划痕,表示负号和负数,并学会了数字线和我们可以给出的数字。因此,是否存在负号(或负号vs加号)表明单个数字是正的还是负的。它只需要一个二进制位来表示我是负的还是正的。即/this浮点格式(或任何其他格式)中的“符号”位 在小学的某个时候,在做了一段时间的分数之后,我们学习了小数点。那只是一段时间
12345.67 = 1.234567 * 10^4
11101.01 = 1.110101 * 2^4