补码的减法

先来谈谈补码的非

补码的非

根据CASAPP,第59页,有如下公式

二进制的减法

减法运算其实是可以由加法运算替代的,我们上面已经介绍过了无符号和补码的非,其实很多CPU是没有减法运算器的,它们都是将减数进行逆运算以后送入加法器,然后进行加法运算,这样得出来的结果就是减法运算最终的结果。

X + Y 就是 X+Y的加法逆元(非)

一种特殊情况

TMIN应该注意,他的加法逆元是他本身。这点在CASPP练习题2.32上有体现

我们来看一下原题

练习题2.32 你现在有个任务,编写函数tsub_ok的代码,函数的参数是x和y,如果计算x-y不产生溢出,函数就返回1。假设你写的练习题2.30的代码如下所示:

/* determine whether arguments can be subtracted without overflow */

/* WARNING: THIS code is buggy */

int tsub_ok(int x,int y) {

return tadd_ok(x,-y);

}

x和y取什么值时,这个函数会产生错误的结果?写一个该函数的正确版本

  1. int tadd_ok(char x,char y)
  2. {
  3.     char sum = (char)x + y;
  4.     printf("sum is %d,y is %d\n",sum,y);
  5.     int neg_over = x < 0 && y < 0 && sum >= 0;
  6.     int pos_over = x >= 0 && y >= 0 && sum < 0;
  7.     return !neg_over && !pos_over;
  8.  
  9. }

其中情况如下

修改如下

  1. int tsub_ok(int x, int y)
  2. {
  3. if (y < 0 && -y < 0) /* y是否为最小负数 */
  4. {
  5. return x < 1;
  6. }
  7. else
  8. return tadd_ok(x, -y);
  9. }
时间: 2024-10-24 21:35:16

补码的减法的相关文章

二进制的计算(计算机为什么采用补码存储数据)

这里先将二进制的计算可以分为两类,加减运算与乘除运算,本篇讨论的是加减运算. (一)预备知识——数据在计算机的存储与表示 从一个问题入手:java中byte(1字节,8位)的取值范围为:-2^7<=取值范围<=2^7-1,或者写成-128<=取值范围<=127,为什么呢? 疑问:按照我们一般认为,如果8位中一位作为符号,那么应该是11111111<=取值范围<=01111111,或者写成-127<=取值范围<=127,-128从何而来? 首先从原码讲起,原码

化减为加:十进制的「补码」

补码把减法变加法的原理其实就是同余. 设 \(n+1\) 位二进制数 \( N = \overline{x_n \cdots x_2x_1x_0} \) 即 \( N = x_0+2x_1+2^{2}x_2+\cdots+2^{n}x_n \;\;\;\; (x_i \in \left\{ 0,1 \right \}) \) 则补码 \( N' = (1-x_0)+2(1-x_1)+2^{2}(1-x_2)+\cdots+2^{n}(1-x_n) + 1 \) \( = 1+2+2^2+\cdo

补码与反码

补码 与反码 计算机中一般采用补码的形式来简化减法运算和逻辑运算.在电路功能实现是,简化减法运算可以减少多余的电路,降低了复杂度.每个进制系统都有两种类型的补码:基数补码和基数减1补码(基数反码). 1.基数反码 定义:对于一个数字:有n位,且进制是r,的数字是N,其反码的定义是(rn -1)-N :例如对于546700的反码的运算就是 106-1 =999999: 999999-546700=453299: 二进制的反码 :对于10001 Rn-1即10000-1=1111 1111-1000

有符号数的加减法 和无符号数的加减法,和,系统是如何识别有符号数和无符号数的

一.有符号数的加减法 1.符号数与无符号数的人为规定性: 一个数,是有符号数还是无符号数都是人为规定的.进行二进制运算时用无符号数或是补码运算时,结果都是正确的. 10000100+00001110 若规定为无符号数,即 132+146=146D . 若规定为符号数,则为-124+14=-110,而[-110]补=10010010.解释:10000100是 -124的补码,0001110是14的补码,在机器中运算后得出的结果是[-110]的补码.机器中的有符号数的运算一般就是补码的运算. 2.补

字符编码--第2章 数的存储

第2章 数的存储 第1节 机器数 计算机中,表示数和数的符号的二进制数,叫做机器数.机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011.如果是 -3 ,就是 10000011 .那么,这里的 00000011 和 10000011 就是机器数. 机器数可用不同的码制来表示,常用的有原码.补码和反码表示法. 第2节 真值 因为第一位是符号位,所以机器数的形式值就不等于真正的数值.例如上面的有符

Hamming Weight的算法分析

看代码时遇到一个求32bit二进制数中1的个数的问题,感觉算法很奇妙,特记录学习心得于此,备忘. 计算一个64bit二进制数中1的个数. 解决这个问题的算法不难,很自然就可以想到,但是要给出问题的最优解,却很有难度. 通常,最容易想到的算法是除余法,继而考虑到除法的代价较高,而且除数是2,会想到使用向右移位来代替除法,并使用&0x1操作来取末位的值,这样提高了算法的效率.然而,这样仍然进行了63次&操作.63次移位操作和63次+操作.若假设字长大小不限,记作N,那么上述算法的时间复杂度都为

Hamming Weight的算法分析(转载)

看代码时遇到一个求32bit二进制数中1的个数的问题,感觉算法很奇妙,特记录学习心得于此,备忘. 计算一个64bit二进制数中1的个数. 解决这个问题的算法不难,很自然就可以想到,但是要给出问题的最优解,却很有难度. 通常,最容易想到的算法是除余法,继而考虑到除法的代价较高,而且除数是2,会想到使用向右移位来代替除法,并使用&0x1操作来取末位的值,这样提高了算法的效率.然而,这样仍然进行了63次&操作.63次移位操作和63次+操作.若假设字长大小不限,记作N,那么上述算法的时间复杂度都为

1.2 数据的表示

1. 计算机中的数 计算机中的数可分为两类:一类是数值性的数,另一类是非数值性的数.数值性的数主要用于计算.非数值性的数主要用于信息处理.数值性的数表示的是事物的数值或数量,非数值性的数表示的是事物的名称.属性.存在位置.形体特征等. 数值性的数有正数和负数,为了在计算机中区分正.负,人们用 0 代表正,用 1 代表负. 数除了有正.负之外,还有整数.小数之分.在计算机中为表示这些数规定了两种形式的数:一种是定点数,另一种是浮点数.其中,定点数又分为定点小数和定点整数.在计算机中不论表示定点数还

数字在计算机中的表示

现实生活中,我们通常使用10进制来表示我们的数字,而在计算机中使用的是“0”和“1”表示数字的二进制. 如果我们用一个字节来存储一个数字,那么这个数字在计算机中的存储形式可能是这样的:00010011.最左边的0位在带符号数字中用来表示正负号,0代表正号,1代表负号,所以它也就叫做符号位:其他位数用来表示具体数字,因此叫做数值位. 00010011如果用来表示带符号整数,那么它代表的数字是+19.+19叫做真值,00010011用于在计算机中表示,所以叫做机器数. 机器数在计算机中的表示形式有三