码迷,mamicode.com
首页 > 其他好文 > 详细

补码的减法

时间:2016-04-19 13:45:14      阅读:358      评论:0      收藏:0      [点我收藏+]

标签:

先来谈谈补码的非

补码的非

根据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. }

 
 

补码的减法

标签:

原文地址:http://www.cnblogs.com/gain/p/5407599.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!