《汇编程序设计与计算机体系结构:软件工程师教程》 —1.4.4 怎样表示带符号的整数

华章计算机 发表于 2019/12/03 21:46:13 2019/12/03
【摘要】 本节书摘来自华章计算机《汇编程序设计与计算机体系结构:软件工程师教程》一书中第1章,第1.4.4节,作者是布莱恩·R. 霍尔(Brian R. Hall)[美] 凯文·J.斯隆卡(Kevin J. Slonka),爱飞翔 译。

1.4.4 怎样表示带符号的整数

      提示:之所以考虑带符号的整数这一问题,是因为便于做减法。从电气工程的角度来看,加法电路很直观,实现起来也很简单,而三种基本的算术运算也都可以通过加法实现,一种是加法本身,另一种是减法(与正数相减,可以化为与负数相加),还有一种是乘法(可以化为连加)。因此,很多 CPU 电路都是加法电路。

 

在计数系统中,整数的符号可以用多种办法表示,例如原码、反码及补码。这三种表示方式都用最高有效位表示正负,0代表正,1代表负。当前的大多数架构(例如 x86 与 x86_64)均采用补码来表示带符号的整数。范例1-12演示了这样两个带符号的整数以及与之相应的十进制值。

范例1-12 带符号的二进制整数

 image.png

      学习指南:请参阅视频 1-2,以了解带符号整数的三种表示方式之间有何区别。

 

原码与反码都有个缺点,就是 0 会以两种形式出现,一种是正0,一种是负0,而且这两种表示方式用硬件实现起来较为困难。与之相比,补码不会出现两个 0 的问题,而且它是根据加法逆元原则设计的,也就是任何数与其加法逆元相加,结果均为 0。

求补码要分两步,首先分别反转每个二进制位,然后给反转的总结果加1。范例 1-13 与范例 1-14 演示了怎样求出二进制正整数与二进制负整数的补码。

范例 1-13 求 +2310 的补码

 image.png

对 +2310 求补码,得出的二进制数实际上是 -2310,如果对这个数求补码,那又会回到原来的 +2310。

范例1-14 求 -10510 的补码

 image.png

      编程知识:带符号的二进制数很有用,不过,程序员还必须学会另外一种更有用的数字表示法,即带符号的十六进制数,因为在调试程序的时候,寄存器与内存中的内容一般都是用十六进制表示的。

 

带符号的十六进制整数,其求补的过程与带符号的二进制整数类似,也分两步,首先分别对每个十六进制位求逆,也就是用 15 与该数位相减,然后给求逆后的总结果加1。下面这条规律可以迅速判断出十六进制整数的正负:

如果最高有效位(MSD)小于等于7,那么该值为正,若大于等于 8,则为负。

范例 1-15 演示了怎样对 +1AB716 求补。

范例 1-15 求 +1AB716 的补码

 image.png

下面列出一些在各种进制的带符号整数之间转换的方法。

带符号的十进制 → 二进制:(1)把原数的绝对值转换成二进制;(2)若原数为负,则对转换出的二进制值求补。

带符号的十进制 → 十六进制:(1)把原数的绝对值转换成十六进制;(2)若原数为负,则对转换出的十六进制值求补。

带符号的十六进制 → 十进制:(1)若原数为负,则先对其求补;(2)将现在的十六进制数转换成十进制;(3)如果原值为负,则给转换出的十进制值添上负号。

在与十六进制负值相减的时候,可以先对值求补,这样就改变了它的符号,从而把减法化成了与正值之间的加法。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。