二进制负数的原码转换为补码的运算规则中的反码加一符号位参与运算吗
2018-11-05 · 知道合伙人互联网行家
关注
展开全部
数值在计算机中表示形式为机器数,计算机只能识别0和1,使用的是二进制,而在日常生活中人们使用的是十进制,"正如亚里士多德早就指出的那样,今天十进制的广泛采用,只不过我们绝大多数人生来具有10个手指头这个解剖学事实的结果.尽管在历史上手指计数(5,10进制)的实践要比二或三进制计数出现的晚."(摘自<<数学发展史>>有空大家可以看看哦~,很有意思的).为了能方便的与二进制转换,就使用了十六进制(2 4)和八进制(23).下面进入正题.
数值有正负之分,计算机就用一个数的最高位存放符号(0为正,1为负).这就是机器数的原码了.假设机器能处理的位数为8.即字长为1Byte,原码能表示数值的范围为
(-127~-0 +0~127)共256个.
有了数值的表示方法就可以对数进行算术运算.但是很快就发现用带符号位的原码进行乘除运算时结果正确,而在加减运算的时候就出现了问题:
( 1 ) 10- ( 1 )10 = ( 1 )10 + ( -1 )10 = ( 0 )10
(00000001)原 + (10000001)原 = (10000010)原 = ( -2 ) 显然不正确.
因为在两个正整数的加法运算中是没有问题的,于是就发现问题出现在带符号位的负整数身上,于是引出了反码(对于正整数原码、反码是一样的,而负整数的反码是原码除最高位(符号位)外其余所有位的逐位求反。).反码的取值空间和原码相同且一一对应. 下面是反码的减法运算:
( 1 )10 - ( 1 ) 10= ( 1 ) 10+ ( -1 ) 10= ( 0 )10
(00000001) 反+ (11111110)反 = (11111111)反 = ( -127) 反= ( -0) 还有问题?!
( 1 )10 - ( 2)10 = ( 1 )10 + ( -2 )10 = ( -1 )10
(00000001) 反+ (11111101)反 = (11111110)反 = ( -126) 反 =( -1 ) 正确
问题出现在(+0)和(-0)上,在人们的计算概念中零是没有正负之分的.(印度人首先将零作为标记并放入运算之中,包含有零号的印度数学和十进制计数对人类文明的贡献极大).
于是又引入了补码(用最高位表示符号位,如果是0表示正数,如果是1表示负数,剩下的7位用来储存数的绝对值的话,能表示128个数的绝对值,再考虑正负两种情况,128*2还是256个数。首先定义0在计算机中储存为00000000,对于正数我们依然可以像无符号数那样换算,从00000001到01111111依次表示1到127。那么这些数对应的二进制码就是这些数的原码(和原码一样)。到这里很多人就会想,那负数是不是从10000001到11111111依次表示-1到-127,那你发现没有,如果这样的话那么一共就只有255个数了,因为10000000的情况没有考虑在内。所以-1到-127不能那样表示(和原码的表示方法相同了,当然错了)。实际上,10000000在计算机中表示最小的负整数,即-128(原指-0的)。因为 -128+1=-127,那么把10000000加上1即10000001表示-127就容易计算很多了。这样,从10000001到11111111就刚好依次表示-127到-1。这就是所谓的补码。). 那么补码是怎样直接地转换得来呢?负数的补码就是对反码加一;而正数不变,正数的原码反码补码是一样的.在补码中用(-128)代替了(-0),所以补码的表示范围为:
(-128~0~127)共256个.
注意:当字长为8位时,(-128)没有相对应的原码和反码, (-128) = (10000000) (为什么?还有为什么8位整数表示的范围是-128~127,而不是-127~128呢?想过没有,为什么二进制10000000在原码和反码中表示0,在补码中它不表示0,保证了0表示的唯一性,但是它为什么表示负数,而不是正数,你也许会说,因为它符号位是1呀,表示负数呀,对,继续,+128我们用补码怎么表示,包括符号位,表示为010000000,超过了2个字节,如果截取低8位,那么是10000000,最高位(符号位)是1,表示的是一个负数了!我们再看看-128的机器码是多少,原码110000000,反码101111111,补码110000000,截取低8位即10000000,表示的是一个负数。)
补码的加减运算如下:
( 1 ) 10- ( 1 ) 10= ( 1 )10 + ( -1 )10 = ( 0 )10
(00000001)补 + (11111111)补 = (00000000)补 = ( 0 ) 正确
( 1 ) 10- ( 2) 10= ( 1 )10 + ( -2 )10 = ( -1 )10
(00000001) 补+ (11111110) 补= (11111111)补 = ( -1 ) 正确
所以补码的设计目的是:
⑴使符号位能与有效值部分一起参加运算,从而简化运算规则.
⑵使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计
所有这些转换都是在计算机的最底层进行的,而在我们使用的汇编、C等其他高级语言中使用的都是原码。看了上面这些大家应该对原码、反码、补码有了新的认识了吧!
数值有正负之分,计算机就用一个数的最高位存放符号(0为正,1为负).这就是机器数的原码了.假设机器能处理的位数为8.即字长为1Byte,原码能表示数值的范围为
(-127~-0 +0~127)共256个.
有了数值的表示方法就可以对数进行算术运算.但是很快就发现用带符号位的原码进行乘除运算时结果正确,而在加减运算的时候就出现了问题:
( 1 ) 10- ( 1 )10 = ( 1 )10 + ( -1 )10 = ( 0 )10
(00000001)原 + (10000001)原 = (10000010)原 = ( -2 ) 显然不正确.
因为在两个正整数的加法运算中是没有问题的,于是就发现问题出现在带符号位的负整数身上,于是引出了反码(对于正整数原码、反码是一样的,而负整数的反码是原码除最高位(符号位)外其余所有位的逐位求反。).反码的取值空间和原码相同且一一对应. 下面是反码的减法运算:
( 1 )10 - ( 1 ) 10= ( 1 ) 10+ ( -1 ) 10= ( 0 )10
(00000001) 反+ (11111110)反 = (11111111)反 = ( -127) 反= ( -0) 还有问题?!
( 1 )10 - ( 2)10 = ( 1 )10 + ( -2 )10 = ( -1 )10
(00000001) 反+ (11111101)反 = (11111110)反 = ( -126) 反 =( -1 ) 正确
问题出现在(+0)和(-0)上,在人们的计算概念中零是没有正负之分的.(印度人首先将零作为标记并放入运算之中,包含有零号的印度数学和十进制计数对人类文明的贡献极大).
于是又引入了补码(用最高位表示符号位,如果是0表示正数,如果是1表示负数,剩下的7位用来储存数的绝对值的话,能表示128个数的绝对值,再考虑正负两种情况,128*2还是256个数。首先定义0在计算机中储存为00000000,对于正数我们依然可以像无符号数那样换算,从00000001到01111111依次表示1到127。那么这些数对应的二进制码就是这些数的原码(和原码一样)。到这里很多人就会想,那负数是不是从10000001到11111111依次表示-1到-127,那你发现没有,如果这样的话那么一共就只有255个数了,因为10000000的情况没有考虑在内。所以-1到-127不能那样表示(和原码的表示方法相同了,当然错了)。实际上,10000000在计算机中表示最小的负整数,即-128(原指-0的)。因为 -128+1=-127,那么把10000000加上1即10000001表示-127就容易计算很多了。这样,从10000001到11111111就刚好依次表示-127到-1。这就是所谓的补码。). 那么补码是怎样直接地转换得来呢?负数的补码就是对反码加一;而正数不变,正数的原码反码补码是一样的.在补码中用(-128)代替了(-0),所以补码的表示范围为:
(-128~0~127)共256个.
注意:当字长为8位时,(-128)没有相对应的原码和反码, (-128) = (10000000) (为什么?还有为什么8位整数表示的范围是-128~127,而不是-127~128呢?想过没有,为什么二进制10000000在原码和反码中表示0,在补码中它不表示0,保证了0表示的唯一性,但是它为什么表示负数,而不是正数,你也许会说,因为它符号位是1呀,表示负数呀,对,继续,+128我们用补码怎么表示,包括符号位,表示为010000000,超过了2个字节,如果截取低8位,那么是10000000,最高位(符号位)是1,表示的是一个负数了!我们再看看-128的机器码是多少,原码110000000,反码101111111,补码110000000,截取低8位即10000000,表示的是一个负数。)
补码的加减运算如下:
( 1 ) 10- ( 1 ) 10= ( 1 )10 + ( -1 )10 = ( 0 )10
(00000001)补 + (11111111)补 = (00000000)补 = ( 0 ) 正确
( 1 ) 10- ( 2) 10= ( 1 )10 + ( -2 )10 = ( -1 )10
(00000001) 补+ (11111110) 补= (11111111)补 = ( -1 ) 正确
所以补码的设计目的是:
⑴使符号位能与有效值部分一起参加运算,从而简化运算规则.
⑵使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计
所有这些转换都是在计算机的最底层进行的,而在我们使用的汇编、C等其他高级语言中使用的都是原码。看了上面这些大家应该对原码、反码、补码有了新的认识了吧!
展开全部
不算符号位的
不相信的话可以给你举个例子证明一下:
不妨取一个4-bit register,规定最高位为符号位,对于-1原码表示为1001;
对于补码,按位取反,末位+1
①假设符号位参与取反,那么补码为0111(按位取反得0110,末位+1得0111)。
此时符号位不是1,而是0,代表正数,显然错误。
其实对于补码,最高位符号位对应的权值是-8,所以0111真正代表数字为
-8*0 + 4*1 + 2*1 + 1*1 = +7
②假设符号位不参与取反,那么符号位不参与运算,补码为1111(按位取反得1110,末位+1得1111)。
结果为 -8*1 + 4*1 + 2*1 + 1*1 = -1
对于原码,最高位权值是-1(所以常常理解为就是一个负号),但是对于补码最高位权值是-2^n(不仅仅是一个负号)
如有错误,欢迎指出。
HITWH ---LEVI
不相信的话可以给你举个例子证明一下:
不妨取一个4-bit register,规定最高位为符号位,对于-1原码表示为1001;
对于补码,按位取反,末位+1
①假设符号位参与取反,那么补码为0111(按位取反得0110,末位+1得0111)。
此时符号位不是1,而是0,代表正数,显然错误。
其实对于补码,最高位符号位对应的权值是-8,所以0111真正代表数字为
-8*0 + 4*1 + 2*1 + 1*1 = +7
②假设符号位不参与取反,那么符号位不参与运算,补码为1111(按位取反得1110,末位+1得1111)。
结果为 -8*1 + 4*1 + 2*1 + 1*1 = -1
对于原码,最高位权值是-1(所以常常理解为就是一个负号),但是对于补码最高位权值是-2^n(不仅仅是一个负号)
如有错误,欢迎指出。
HITWH ---LEVI
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
二进制负数的原码转换为补码的运算规则中的反码加一符号位参与运算吗?
--------------------
原码取反时,肯定不参与。
反码加一时,就两说了。
数值位加一,进位,如果没有进到符号位,那就不参与。
数值位加一,进位,如果进到了符号位,就必须参与了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
求负数补码,可以用定义式来做。
[ X ]补码 = 2^n- X。
不用闲扯“原码反码取反加一符号位不变”这摊子烂事。
另外,-128有八位的补码,却没有原码和反码。
因此,取反加一,也就无法使用。
[ X ]补码 = 2^n- X。
不用闲扯“原码反码取反加一符号位不变”这摊子烂事。
另外,-128有八位的补码,却没有原码和反码。
因此,取反加一,也就无法使用。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不参与运算!!!
分析如下:以字长8位的机器码为例,如果最后加一,导致符号位后一位向符号位进1,既第七是 1,同理第六位也是 1,...由此得 对应的反码为:
[x]反=1111 1111 则
[x]原=1000 0000
对应的数值是 x= -0
现对[x]反进行加一操作:
如果符号位不参与运算得:
[x]补=1000 0000
而补码的 1000 0000 是-128 与规定矛盾,难道要参与运算了吗?
不是,是因为对于补码没有 –0。
实际上在实际中的运算中,如果数据范围没有发生溢出,是不会出现 对反码的加一操作加到符号位的。因为 –128 的原码为
[–128]原=1 1000 0000
[-128]反=1 0111 1111
[-128]补= 1000 0000
可见对于字长为8位的原码和反码不能表示-128。
所以,如果 x<0 ,在规定的字长中,反码是不会出现所有位都是1的情况,也就不会出现考虑 符号位是否要参与运算 ;而x ≥ 0 求补码 直接是原码。
分析如下:以字长8位的机器码为例,如果最后加一,导致符号位后一位向符号位进1,既第七是 1,同理第六位也是 1,...由此得 对应的反码为:
[x]反=1111 1111 则
[x]原=1000 0000
对应的数值是 x= -0
现对[x]反进行加一操作:
如果符号位不参与运算得:
[x]补=1000 0000
而补码的 1000 0000 是-128 与规定矛盾,难道要参与运算了吗?
不是,是因为对于补码没有 –0。
实际上在实际中的运算中,如果数据范围没有发生溢出,是不会出现 对反码的加一操作加到符号位的。因为 –128 的原码为
[–128]原=1 1000 0000
[-128]反=1 0111 1111
[-128]补= 1000 0000
可见对于字长为8位的原码和反码不能表示-128。
所以,如果 x<0 ,在规定的字长中,反码是不会出现所有位都是1的情况,也就不会出现考虑 符号位是否要参与运算 ;而x ≥ 0 求补码 直接是原码。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询