计算机中如何表示正负数?如何表示整数和实数?

来源:学生作业帮助网 编辑:作业帮 时间:2024/04/29 09:24:24

计算机中如何表示正负数?如何表示整数和实数?
计算机中如何表示正负数?如何表示整数和实数?

计算机中如何表示正负数?如何表示整数和实数?
这个问题并不复杂,表示一个带符号的整数常用的方法有三种:原码、反码表示法和补码表示法.先来看看原码表示法.在计算机中,数的符号是用一个数位来表示的,一般用数的最高位.正号用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"指令移位会使符号位发生变化,所以负数无法用这两条指令完成乘除计算.