定点格式负数的正确表示方法咨询——以-1.101001₂×2^(-4)为例
你的定点数理解误区与正确表示方法
首先,我们先理清核心问题:你写出的编码本身是对的,错误出在你用了错误的验证方法,同时对定点数格式的描述存在混淆。
先拆解原数的二进制本质
你给出的浮点数 -1.101001₂ × 2^(-4),可以转化为纯二进制小数:把 1.101001₂ 右移4位,得到 0.0001101001₂,所以原数是 -0.0001101001₂,对应十进制 -0.1025390625,这部分你是对的。
你的编码为什么是对的?
你写出的 1 0 0001101001(即二进制 100001101001),如果按照12位原码定点小数格式(1位符号位 + 1位整数位 + 10位小数位)来解释,计算逻辑是:
- 最高位
1表示负数; - 第二位
0表示整数部分为0; - 后面10位
0001101001₂是小数部分,计算值为:1×2^-4 + 1×2^-5 + 1×2^-7 + 1×2^-10 = 0.0625 + 0.03125 + 0.0078125 + 0.0009765625 = 0.1025390625;
所以整个数的十进制值就是-0.1025390625,完全正确!
你为什么觉得它不对?
你说这个编码对应 -1.8975,是因为你错误地把这个12位二进制数当成了补码整数来计算,然后乱做了缩放。举个例子:100001101001 作为12位补码整数,值是 -1991,如果你错误地用 -1991/1049 去算,才会得到近似 -1.897 的结果——但这是整数补码的计算逻辑,完全不适用定点小数的原码表示。
额外补充:补码格式的正确表示
如果你的场景要求用补码定点小数(12位:1位符号位 +1位整数位 +10位小数位),正确的编码是 1 1 1110010111(即 111110010111)。计算逻辑是:
补码小数的最高位权重是 -2^1,整数位权重是 2^0,小数位权重是 2^-1 到 2^-10,代入后:-2×1 + 1×1 + 919/1024 = -2 +1 +0.8974609375 = -0.1025390625,同样得到正确值。
你需要修正的两个误区
- 格式描述错误:符号位不属于小数位,正确的12位定点数(10位小数)应该是「1位符号位 + 1位整数位 + 10位小数位」,而非“小数位10位含符号位”。
- 编码验证逻辑错误:定点小数的原码/补码计算逻辑和整数补码完全不同,不能用整数补码的方法去验证定点小数的编码。
内容的提问来源于stack exchange,提问作者Quang Thinh Ha
相关产品推荐
相关产品推荐

