2进制数运算的时候符号位需要变化吗?
发布网友
发布时间:2022-04-29 23:46
我来回答
共4个回答
热心网友
时间:2022-06-26 08:06
在计算机中是这样规定的,用一个数的最高一位表示正负,0为正,1为负.如0111,1111转换为十进制为127,1111,1111为-127,由此我们知一字节的范围为-127--127,其他字节的范围类推.
上面讲的都是原码表示法,可在计算机中的数据都是以补码存放的,只有这样计算时才能减轻cpu的负担(为什么,请参考“计算机基础教程”).提到补码,就不得不提反码了.计算机中是这样规定反码的,如果是正数,则按原码形式不变,如127仍为0111,1111;而如果为负数则,第一位为1,其他各位取反(即0变为1,1变为0),如原码-127(1111,1111),表示为1000,0000.
补码同上,如果是正数,则按原码形式不变,如127仍为0111,1111;如果为负数则除第一位为1外,其他各位取反加1,如-127,先取反为1000,0000,然后加1,为1000,0001.但1000,0000比较特殊,用它来表示-128,由此我们知补码可表示的范围是-128--127.
下面举几个例子:
1)原码
X=45 [X]原=0010 1101
X=-45 [X]原=1010 1101
2)反码
·正数的原码与反码相同( 正数的反码与原码相同,符号位用0表示,数值位值不变 )
X=45 [X]原=0010 1101 [X]反=0010 1101
·负数的反码符号位用1表示, 数值位为原码数值位按位取反形成,即0变1、1变0。
X=-45 [X]原=1010 1101 [X]反=1101 0010
3)补码
·正数的补码与原码相同,即符号位用0表示,数值位值不变。
X=45 [X]原=0010 1101 [X]反=0010 1101 [X]补=0010 1101
·负数的补码为反码加1
X=-45 [X]原=1010 1101 [X]反=1101 0010 [X]补=1101 0011
注
[-127]10=[1111 1111]原=[1000 0000]反=[1000 0001]补
[1000 0001]补+1=[1000 0010]补=[11111110]原=[-126]10
可以看出结果是正确的。
有了计算机补码后,运算时可以将符号位一道参与运算
热心网友
时间:2022-06-26 08:06
+13+(-10)是溢出
要运算的结果大于数值设备所能表示数的范围,就会产生溢出.
如何判断补码溢出:
可以通过最高位与次高位进位来判断:若最高数值位向符号位的进位值与符号位产生的进位输出值不相同,则表明加减运算产生了溢出.
溢出现象应当作一种故障来处理,因为它使结果数发生错误.异号两数相加时,实际是两数的绝对值相减,不可能产生溢出,但有可能出现正常进位;同号两数相加时,实际上是两数的绝对值相加,既可能产生溢出,也可能出现正常进位.由于补码运算存在符号位进位自然丢失而运算结果正确的问题,因此,应区分补码的溢出与正常进位.
只有有符号数存在溢出,无符号数不存在溢出~
热心网友
时间:2022-06-26 08:07
补充:原码、反码中0都有两个,而补码中却只有一个,原因就是它把其中一个转为最小的-128(10000000),而原码中的10000000表示的是00000000,不能按常规来解释原码的10000000的补码,如果按常规来讲,就是10000000(-0变成了-128)。
来看下关于1000000的运算(默认为补码)
10000000 + 00000001 = 10000001 = 11111111(原)
(-128 + 1 = -127)
01111111 + 00000001 = 10000000
(127 + 1 = -128)(溢出)(这里没有转成原码,因为转后就是-0)
楼主说11111111表示-127,看来用的是原码。那么原码中相反符号数之间的加法做的是减法,所以结果是11111110(-126),计算机内是以补码形式存在的,所以11111111表示-1,加1的结果就是00000000。
而对于10000000,楼主的意思好像是原码,也就是原码中的0,它的补码也同样是0。求补得到的结果也是一样的。
热心网友
时间:2022-06-26 08:08
你说的:一个2进制数11111111,表示的是-127,...
这应该是-127 的原码,并不是数。
原码,就不需要讨论了。
你求出补码,再说计算的问题。
因为,计算机中的计算,都是用补码进行的。
原码和反码,在计算机中,都不存在。