Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 浮点数是如何存储在CPU中的?_Assembly_Floating Point_Ieee 754 - Fatal编程技术网

Assembly 浮点数是如何存储在CPU中的?

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 位以节省空间。因此,如果

我是一名初学者,正在学习组装基础知识。现在读这篇文章时,我想到了这一段。它解释了浮点数是如何存储在内存中的

浮点的指数是一个8位字段。允许大量或 如果要存储较小的数字,则指数被解释为正或负 消极的实际指数是8位字段的值减去127。 127是32位浮点数的“指数偏差”。 浮点数的分数域有一个小惊喜。因为定义了0.0 由于所有位都设置为0,因此无需担心将0.0表示为0 指数字段等于127,分数字段设置为所有O。所有其他 数字至少有一个1位,因此IEEE 754格式使用隐式1 位以节省空间。因此,如果分数字段为00000000000000000,则 被解释为1。00000000000000000000000. 这允许分数 字段的有效长度为24位。这是一个聪明的把戏,由 使OxOO和OxFF的指数字段特殊

我一点也不明白


你能解释一下它们是如何存储在内存中的吗?我不需要参考资料,我只需要一个好的解释,这样我就可以很容易地理解。

浮点数紧随其后。他们一直在使用这套规则,主要是因为浮点数可以(相对)轻松地与整数和其他浮点数进行比较

浮点有两种常见版本: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位模式作为整数进行比较会告诉您哪一个具有更大的幅度,如果它们具有相同的符号。)此外,增加位模式(包括从尾数到指数的进位)会将幅度增加到下一个可表示的值。(
    nextafter()

    如果我们不这样做,负指数将使用两个补码表示法表示,基本上是在最高有效位加1。但在这种情况下,较小的浮点似乎比正指数浮点更大。出于这个原因:我们只需添加127,使用这个小“技巧”,所有正指数从
    10000000
    base 2(以1为基数10)开始,而负指数最多达到
    0111110
    base 2(以-1为基数10)

在我们的示例中,归一化指数是
1000010
base 2

  • 最后一件事是在指数之后添加mantix(
    .100011
    ),结果是:

    01000001010001100000000000000000
     |  exp ||      mantix         |
    
(第一位是符号位)

有一个很好的在线转换器,它可以可视化32位浮点的位,并显示它所表示的十进制数。您可以修改其中一个,它会更新另一个


这是一个简单的版本,这是一个良好的开端。它简化了,省去了:

  • 非数字NaN(有偏指数=所有1;尾数!=0)
  • +-无穷大(有偏指数=所有1;尾数=0)
  • 也没有说太多关于次正常值的数字(偏差指数=0意味着尾数中的前导0而不是正常值1)
维基百科上关于单精度和双精度的文章非常优秀,有图表和大量关于角点情况和细节的解释。有关完整的详细信息,请参见

此外,一些(大部分是历史)计算机使用的FP格式不是IEEE-754

还有其他IEEE-754格式,比如16位半精度,一个值得注意的扩展精度格式是80位x87,它显式存储有效位的前导1,而不是由零或非零指数暗示


IEEE-754甚至定义了一些十进制浮点格式,使用10^exp精确表示十进制分数而不是二进制分数。(硬件支持有限,但确实存在)。

与小学数学没有什么不同。我们在小学就学会了先做正整数,然后加,减。然后我们学会了做一个水平划痕,表示负号和负数,并学会了数字线和我们可以给出的数字。因此,是否存在负号(或负号vs加号)表明单个数字是正的还是负的。它只需要一个二进制位来表示我是负的还是正的。即/this浮点格式(或任何其他格式)中的“符号”位

在小学的某个时候,在做了一段时间的分数之后,我们学习了小数点。那只是一段时间
12345.67 = 1.234567 * 10^4
11101.01 = 1.110101 * 2^4