计算机中如何表示正负数如何表示整数和实数
这个问题并不复杂,表示一个带符号的整数常用的方法有三种:原码、反码表示法和补码表示法。先来看看原码表示法。在计算机中数的符号是用一个数位来表示的,一般用数的最高位。正号用0表示,负号用1表示。所谓原码就是简单地遵循这一规定的一种表示法。例如我们用原码表示+1,可以写成00000001,其最高位是0,表明这个数的符号是+。如果表示-1,则可以写成10000001,最高位的1就表示其符号为―。这种表示带符号数的方法法就是原码表示法。
反码比原码复杂一些,它规定若一个数值为正,则它的反码和原码形式相同。如+1仍写成00000001;若一个数值为负,则反码的符号位为1,其余各位对原码取反。如-1写成11111110;这两种方法在计算机中很少采用,原因很简单,原码和反码不便于运算。举个例子:用原码计算-1+1=?
问题似乎不难,但需要考虑的事情很多。假如只是简单地在10000001的最低位加上1,那么将得到结果--10000010,根据原码的规定,这个结果是-2。
要想得到正确结果,我们必须首先要考虑将符号位置0,同时最低位也不能加1,而要减1。即使采用反码计算,也要单独处理其符号。这样计算不仅对我们自己,就是对CPU来说也是不方便的。因此多数机器都采用补码表示法。
在补码表示法中对于负数的表达要比反码麻烦一些,负数X用2n-|X|表示,其中n是数的位数。对于八位二进制数来讲n=8,因此用八位二进制补码表示-1就是28-1=11111111,也就是十六进制数0FFH。正数的表示方法和原码一样,+1也写成00000001。
由此我们可以发现正负数之间具有这样一种转换关系:将+1的所有位取反得到11111110,再在最低位上加1就得到11111111,也就是-1。同时我们也能看出补码表示法中关于符号位的规定和原码是一样的。
那么10000001在补码表示法中是哪个数呢?按照刚才发现的规律,将它的各个位取反,得01111110,再加上1,得01111111,即十进制的+127,也就是说10000001表示-127。
为什么要用这样的表示法,这主要是因为补码便于计算。我们可以用补码重新计算-1+1=?
由于-1的补码是11111111,将其加1,会得到100000000,这是一个九位二进制数,如果舍掉最高位,就得到正确的结果--00000000。
这似乎有点不讲理,凭什么舍去最高位呢?道理其实很简单。
将FF(-1)加1之后AL确实成了0。AL是八位寄存器,它不可以记录第九位,因而在AL寄存器中只保留了低八位。
那么是不是多出的一位就无影无踪了呢?并非如此,如果仔细观察DEBUG显示出的内容,就会发现标志寄存器中有一些位发生了变化:AF(辅助进位标志)和CF(借位/进位标志)被置成1了。
由于我们采用了八位寄存器,运算结果产生了第九位,这一位作为进位送入了CF标志位。至于AF,它记录了AL寄存器低四位的进位情况
那么是不是多出的一位就无影无踪了呢?并非如此,如果仔细观察DEBUG显示出的内容,就会发现标志寄存器中有一些位发生了变化:AF(辅助进位标志)和CF(借位/进位标志)被置成1了。
由于我们采用了八位寄存器,运算结果产生了第九位,这一位作为进位送入了CF标志位。至于AF,它记录了AL寄存器低四位的进位情况。
低四位产生进位的情况由AF反映出来。
采用补码表示法还有一个好处,它可以把加、减法统一成加法,很容易看出1-1和1+FF(-1)的实际结果是一样的。至于补码的乘除法运算这里不再多讲,查阅有关书籍即可掌握。
明白了数字的表示方法,那么我们在前面讨论的移位与乘除法的问题也就迎刃而解了。用SHL/SHR指令移位会使符号位发生变化,所以负数无法用这两条指令完成乘除计算。
免责声明:本站发布的教育资讯(图片、视频和文字)以本站原创、转载和分享为主,文章观点不代表本网站立场。
如果本文侵犯了您的权益,请联系底部站长邮箱进行举报反馈,一经查实,我们将在第一时间处理,感谢您对本站的关注!
新励学网教育平台
海量全面 · 详细解读 · 快捷可靠
累积科普文章数:18,862,126篇