fxpmath中符号数是否仅用1's complement?如何切换为2's complement?
fxpmath库中负数补码表示的疑问解答
问题描述
使用fxpmath库时,误以为有符号数的负数是以1's complement(一进制补码)表示,希望改为2's complement(二进制补码)展示。以下是测试代码及输出:
测试代码
from fxpmath import Fxp c = Fxp(complex(3.2500+2.0625j), True, 8, 4) # (val, signed, n_word, n_frac) print(c) print((c).bin()) # binary representation d = Fxp(complex(2.0625+5.2500j), True, 8, 4) # (val, signed, n_word, n_frac) print(d) print((d).bin()) # binary representation y= Fxp(complex(c*d), True, 16,8) print(y) print((y).bin()) # binary representation
运行输出
(3.25+2.0625j) 00110100+00100001j (2.0625+5.25j) 00100001+01010100j (-4.125+21.31640625j) 1111101111100000+0001010101010001j
用户观察到相乘结果的实部-4.125的二进制为1111101111100000,误以为是1's complement,希望改为2's complement形式展示。
解答
首先明确:fxpmath库默认采用2's complement存储有符号数,你看到的二进制输出其实就是2's complement形式,并非1's complement。
验证过程:
- 4.125的二进制表示(8位整数+8位小数):
00000100 00100000 - 2's complement计算逻辑:对正数的二进制取反后加1
- 取反结果(1's complement):
11111011 11011111 - 加1后结果:
11111011 11100000,与你输出的1111101111100000完全一致
- 取反结果(1's complement):
如果需要直接验证补码属性,可通过fxpmath的内置属性查看:
# 查看y实部的2's complement数值 print(y.real.twos_complement)
若需要调整二进制输出格式,可通过bin()方法的参数自定义,比如按位分组显示:
# 以4位一组的形式输出二进制 print(y.bin(space=4))
内容的提问来源于stack exchange,提问作者mohammed zeeshan
相关产品推荐
相关产品推荐

