《汇编程序设计与计算机体系结构:软件工程师教程》 —1.4.4 怎样表示带符号的整数
1.4.4 怎样表示带符号的整数
提示:之所以考虑带符号的整数这一问题,是因为便于做减法。从电气工程的角度来看,加法电路很直观,实现起来也很简单,而三种基本的算术运算也都可以通过加法实现,一种是加法本身,另一种是减法(与正数相减,可以化为与负数相加),还有一种是乘法(可以化为连加)。因此,很多 CPU 电路都是加法电路。
在计数系统中,整数的符号可以用多种办法表示,例如原码、反码及补码。这三种表示方式都用最高有效位表示正负,0代表正,1代表负。当前的大多数架构(例如 x86 与 x86_64)均采用补码来表示带符号的整数。范例1-12演示了这样两个带符号的整数以及与之相应的十进制值。
范例1-12 带符号的二进制整数
学习指南:请参阅视频 1-2,以了解带符号整数的三种表示方式之间有何区别。
原码与反码都有个缺点,就是 0 会以两种形式出现,一种是正0,一种是负0,而且这两种表示方式用硬件实现起来较为困难。与之相比,补码不会出现两个 0 的问题,而且它是根据加法逆元原则设计的,也就是任何数与其加法逆元相加,结果均为 0。
求补码要分两步,首先分别反转每个二进制位,然后给反转的总结果加1。范例 1-13 与范例 1-14 演示了怎样求出二进制正整数与二进制负整数的补码。
范例 1-13 求 +2310 的补码
对 +2310 求补码,得出的二进制数实际上是 -2310,如果对这个数求补码,那又会回到原来的 +2310。
范例1-14 求 -10510 的补码
编程知识:带符号的二进制数很有用,不过,程序员还必须学会另外一种更有用的数字表示法,即带符号的十六进制数,因为在调试程序的时候,寄存器与内存中的内容一般都是用十六进制表示的。
带符号的十六进制整数,其求补的过程与带符号的二进制整数类似,也分两步,首先分别对每个十六进制位求逆,也就是用 15 与该数位相减,然后给求逆后的总结果加1。下面这条规律可以迅速判断出十六进制整数的正负:
如果最高有效位(MSD)小于等于7,那么该值为正,若大于等于 8,则为负。
范例 1-15 演示了怎样对 +1AB716 求补。
范例 1-15 求 +1AB716 的补码
下面列出一些在各种进制的带符号整数之间转换的方法。
带符号的十进制 → 二进制:(1)把原数的绝对值转换成二进制;(2)若原数为负,则对转换出的二进制值求补。
带符号的十进制 → 十六进制:(1)把原数的绝对值转换成十六进制;(2)若原数为负,则对转换出的十六进制值求补。
带符号的十六进制 → 十进制:(1)若原数为负,则先对其求补;(2)将现在的十六进制数转换成十进制;(3)如果原值为负,则给转换出的十进制值添上负号。
在与十六进制负值相减的时候,可以先对值求补,这样就改变了它的符号,从而把减法化成了与正值之间的加法。
- 点赞
- 收藏
- 关注作者
评论(0)