计算机计有符号数计算,有符号数处理
在计算机内,定点数分为有符号数(signed)和⽆符号数(unsigned)。其中,有符号数的表⽰⽅法有三种:原码、反码和补码。反码表⽰法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
中⽂名
有符号数处理
表⽰法
原码、反码和补码进 制
⼆进制
规 定
正数的补码与其原码相同
有符号数处理基本介绍
编辑
语⾳
在计算机内,有符号数有3种表⽰法:原码、反码和补码。
有符号数处理详细释义
编辑
语⾳
所谓原码就是⼆进制定点表⽰法,即最⾼位为符号位,“0”表⽰正,“1”表⽰负,其余位表⽰数值的⼤⼩。
反码表⽰法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
原码10010= 反码11101 (10010,1为符号码,故为负)
(11101) ⼆进制= -13 ⼗进制
补码表⽰法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。[1]
有符号数处理表⽰⽅法
编辑
语⾳
有符号数处理原码
(1) 原码:在数值前直接加⼀符号位的表⽰法。
例如: 符号位 数值位
[+7]原= 0 0000111 B
[-7]原= 1 0000111 B
注意:a. 数0的原码有两种形式:[+0]原=00000000B [-0]原=10000000B
b. 8位⼆进制原码的表⽰范围:-127~+127
有符号数处理反码
(2)反码:
正数:正数的反码与原码相同。
负数:负数的反码,符号位为“1”,数值部分按位取反。例如: 符号位 数值位
[+7]反= 0 0000111 B
[-7]反= 1 1111000 B
注意:a. 数0的反码也有两种形式,即
[+0]反=00000000B
[- 0]反=11111111B
b. 8位⼆进制反码的表⽰范围:-127~+127
有符号数处理补码
(3)补码的表⽰⽅法
1)模的概念:把⼀个计量单位称之为模或模数。例如,时钟是以12进制进⾏计数循环的,即以12为模。在时钟上,时针加上(正拨)12的整数位或减去(反拨)12的整数位,时针的位置不变。14点钟在舍去模12后,成为(下午)2点钟(14=14-12=2)。从0点出发逆时针拨10格即减去10⼩时,也可看成从0点出发顺时针拨2格(加上2⼩时),即2点(0-10=-10=-10+12=2)。因此,在模12的前提下,-10可映射为
+2。由此可见,对于⼀个模数为12的循环系统来说,加2和减10的效果是⼀样的;因此,在以12为模的系统中,凡是减10的运算都可以⽤加2来代替,这就把减法问题转化成加法问题了(注:计算机的硬件结构中只有加法器,所以⼤部分的运算都必须最终转换为加法)。10和2对模12⽽⾔互为补数。
同理,计算机的运算部件与寄存器都有⼀定字长的限制(假设字长为8),因此它的运算也是⼀种模运算。当计数器计满8位也就是256个数后会产⽣溢出,⼜从头开始计数。产⽣溢出的量就是计数器的模,显然,8位⼆进制数,它的模数为2^8=256。在计算中,两个互补的数称为“补码”。
2)补码的表⽰:
正数:正数的补码和原码相同。
负数:负数的补码则是符号位为“1”。并且,这个“1”既是符号位,也是数值位。数值部分按位取反后再在末位(最低位)加1。也就
是“反码+1”。
例如: 符号位 数值位
[+7]补= 0 0000111 B
[-7]补= 1 1111001 B
补码在微型机中是⼀种重要的编码形式,请注意:
a. 采⽤补码后,可以⽅便地将减法运算转化成加法运算,运算过程得到简化。正数的补码即是它所表⽰的数的真值,⽽负数的补码的数值部份却不是它所表⽰的数的真值。采⽤补码进⾏运算,所得结果仍为补码。
b. 与原码、反码不同,数值0的补码只有⼀个,即 补=00000000B。
c. 若字长为8位,则补码所表⽰的范围为-128~+127;进⾏补码运算时,应注意所得结果不应超过补码所能表⽰数的范围。[2]
有符号数处理转换⽅法
编辑
语⾳
由于正数的原码、补码、反码表⽰⽅法均相同,不需转换。
在此,仅以负数情况分析。
(1) 已知原码,求补码。
例:已知某数X的原码为10110100B,试求X的补码和反码。
解:由[X]原=10110100B知,X为负数。求其反码时,符号位不变,数值部分按位求反;求其补码时,再在其反码的末位加1。
1 0 1 1 0 1 0 0 原码
1 1 0 0 1 0 1 1 反码,符号位不变,数值位取反
1 +1
1 1 0 0 1 1 0 0 补码
故:[X]补=11001100B,[X]反=11001011B。
(2) 已知补码,求原码。
分析:按照求负数补码的逆过程,数值部分应是最低位减1,然后取反。但是对⼆进制数来说,先减1后取反和先取反后加1得到的结果是⼀样的,故仍可采⽤取反加1 有⽅法。
例:已知某数X的补码11101110B,试求其原码。
解:由[X]补=11101110B知,X为负数。
采⽤逆推法
1 1 1 0 1 1 1 0 补码
1 1 1 0 1 1 0 1 反码(末位减1)
1 0 0 1 0 0 1 0 原码(符号位不变,数值位取反)
1.3.2有符号数运算时的溢出问题
有符号数处理使⽤⽰例
编辑
语⾳
请⼤家来做两个题⽬:
两正数相加怎么变成了负数
1)(+72)+(+98)=?
0 1 0 0 1 0 0 0 B +72
+ 0 1 1 0 0 0 1 0 B +98
1 0 1 0 1 0 1 0 B -86
两负数相加怎么会得出正数
2)(-83)+(-80)=?
1 0 1 0 1 1 0 1 B -83
+ 1 0 1 1 0 0 0 0 B -80
0 1 0 1 1 1 0 1 B +93
思考:这两个题⽬,按照正常的法则来运算,但结果显然不正确,这是怎么回事呢?
答案:这是因为发⽣了溢出。
如果计算机的字长为n位,n位⼆进制数的最⾼位为符号位,其余n-1位为数值位,采⽤补码表⽰法时,可表⽰的数X的范围是 -2的次幂
≤X≤2的次幂-1
当n=8时,可表⽰的有符号数的范围为-128~+127。两个有符号数进⾏加法运算时,如果运算结果超出可表⽰的有符号数的范围时,就会发⽣溢出,使计算结果出错。很显然,溢出只能出现在两个同符号数相加或两个异符号数相减的情况下。
负数二进制补码运算法则对于加法运算,如果次⾼位(数值部分最⾼位)形成进位加⼊最⾼位,⽽最⾼位(符号位)相加(包括次⾼位的进位)却没有进位输出时,或者反过来,次⾼位没有进位加⼊最⾼位,但最⾼位却有进位输出时,都将发⽣溢出。因为这两种情况是:两个正数相加,结果超出了范围,形式上变成了负数;两负数相加,结果超出了范围,形式上变成了正数。
⽽对于减法运算,当次⾼位不需从最⾼位借位,但最⾼位却需借位(正数减负数,差超出范围),或者反过来,次⾼位需从最⾼位借位,但最⾼位不需借位(负数减正数,差超出范围),也会出现溢出。
在计算机中,数据是以补码的形式存储的,所以补码在c语⾔的教学中有⽐较重要的地位,⽽讲解补码必须涉及到原码、反码。
在n位的机器数中,最⾼位为符号位,该位为零表⽰为正,为⼀表⽰为负;其余n-1位为数值位,各位的值可为零或⼀。当真值为正时,原码、反码、补码数值位完全相同;当真值为负时,原码的数值位保持原样,反码的数值位是原码数值位的各位取反,补码则是反码的最低位加⼀。注意符号位不变。[1]
有符号数处理信息总结
编辑
语⾳
提⽰信息不要太少,可“某某数的反码是某某”,⽽不是只显⽰数值。
1.原码的求法:(1)对于正数,转化为⼆进制数,在最前⾯添加⼀符号位(这是规定的),⽤1表⽰负数,0表⽰正数.如:0000 0000是⼀个字节,其中左边第⼀个0为符号位,表⽰是正数,其它七位表⽰⼆进制的值.其
实,机器不管这些,什么符号位还是值,机器统统看作是值来计算. 正数的原码、反码、补码是同⼀个数!
(2)对于负数,转化为⼆进制数,前⾯符号位为1.表⽰是负数.
计算原码只要在转化的⼆进制数前⾯加上相应的符号位就⾏了.
2.反码的求法:对于负数,将原码各位取反,符号位不变.
3.补码的求法:对于负数,将反码加上⼆进制的1即可,也就是反码在最后⼀位上加上1就是补码了.[2]
参考资料
1.
"Bitcode (iOS, watchOS)". Hacker News. 10 June 2015. Retrieved 17 June 2015.
2.
The radare2 contributors. "ESIL". radare2 project. Retrieved 17 June 2015.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论