作业帮 > 数学 > 作业

教科书中,关于补码乘法的证明,其中有一段是:设x的符号为任意,y的符号为正,

来源:学生作业帮 编辑:作业帮 分类:数学作业 时间:2024/08/23 06:23:03
教科书中,关于补码乘法的证明,其中有一段是:设x的符号为任意,y的符号为正,
则有:[x*y]补=[x]补*[y]补=[x]补*y(这个式子的证明过程就不叙述了)
我认为以上论述有点问题,如果我们演算一下,如取x=-0.0101 ,y=+0.0001
则乘积的真值x*y=-0.00000101,乘积的补码[x*y]补=1.11111011 ,而补码的乘积,即[x]补*[y]补=1.1011*0.0001=0.00011011 ,这显然矛盾了.
不知我的推理有没有错误,
谁能给出一个具体例子来证明这个公式的正确性
x=-0.0101 -0.0101这就是个补码 ,我们说x=-7 ,-7就是补码,补码指的是数字在计算机内部是以补码来表示的,就是计算机内的数字都是补码,不存在原码和反码,原码和反码仅仅是书上为了解释补码才弄出来的概念,并且浮点数的补码和整数的补码规则不一样,只有符号位的概念和整数一样,浮点数的 -1.0和整数的-1纯粹两回事,浮点数的负数仅仅是最高位的符号位变为1了,有效数字位不变
按IEEE754规范,float格式的-0.0101的32位补码是这样的:
10111110 10100000 00000000 00000000
0.0101的32位补码是这样的
00111110 10100000 00000000 00000000
仅仅是符号位的区别
如果是定点小数
x原=-0.0101 既然是补码,那就要知道和那个值求补,也就是要知道是多少位的,假设总共12位 所以-0.0101的补码是111111111.1011 ,那么111111111.1011*0.0001就是1111.11111011,同样的[x*y]补=1.11111011也是1111.11111011,既然是按位取反,就要把整数部分全部取反,而不是仅仅一个1,-0.0101是-0000000000.0101,要把所有的0都取反,而不是仅仅一位,你就是在这里搞错了
所以实际上我们根本不需要关心这个补码的表现形式,只要知道x=-0.0101这就是个补码就行了,x就是x补,x在机器内就是以补码表示的
x=-0.0101 , y=+0.0001 ,x*y=-0.00000101这就是个补码 也就是[x*y]补=-0.00000101

[x*y]补=[x]补*[y]补=[x]补*y 这个公式实际上就是在说:x*y==x*y==x*y,等于废话



我认为上面都讲得很清楚了,再给你个例子:
-0.5*0.5
以8位定点小数为例:

-0.5的原码是0000000.1,补码是1111111.1 不是1.1 (你就是这里搞错了)
1111111.1*0.1=111111.11
-0000000.1*0.1==-0.01,补码是111111.11
这就是一回事