leetcode-Reverse Integer

  1. int reverse(int x,bool &flag) {//flag means if the result is overflow  
  2.     int signal=1;  
  3.     if (x<0)  
  4.     {  
  5.         signal=-1;  
  6.     }  
  7.     int temp,ret=0,newv=0;  
  8.     while(x!=0)  
  9.     {  
  10.         temp = x%10;  
  11.         x = x/10;  
  12.         if (x!=0)  
  13.         {  
  14.             newv = newv*10 + temp;  
  15.         }  
  16.         else//last bit may overflow  
  17.         {  
  18.             if (signal<0)  
  19.             {  
  20.                 if ( 10*newv + temp >= 0)  
  21.                 {  
  22.                     flag = false;  
  23.                     ret = -1;  
  24.                     return ret;  
  25.                 }  
  26.                 ret = 10 * newv + temp;  
  27.             }  
  28.             else  
  29.             {  
  30.                 if ( 10*newv + temp <= 0)  
  31.                 {  
  32.                     flag = false;  
  33.                     ret = -1;  
  34.                     return ret;  
  35.                 }  
  36.                 ret = 10 * newv + temp;  
  37.             }  
  38.               
  39.         }  
  40.     }  
  41.     return ret;  
  42. }  
花了将近俩个小时,判断何时溢出,若是两位符号位表示的话,机器可以好判断。但是我们的机器都是一位的,机器没法判断,都说负负相加若为正,或者正正相加为负时就是溢出,为什么是这样呢?正正相加可以理解,因为最高位符号位被进位占了,所以变负数了(当然都是补码表示了,负数的补码符号位也是1)。至于负负相加为什么能为正?负负相加时,补码的最高位都是一,若补码的第二高位也都是一的话,那么结果肯定是负数了,若第二高位不都是一(可能都是零),那么就不会产生进位,结果就为正了。至于什么时候第二高位是一的可能性大些,就是原来负数原码的第二高位小些(因为原码取反加一变补码呀),即负数的绝对值小些,这样最终的补码结果才有可能是负数,才不会溢出。所以当负数的绝对值越大,原码的前面的位就越大,补码的前面的位就越小,最后相加结果(加法器用补码表示这都知道)就没有向最高位的进位(因为第二高位没有进位),所以结果第一位就是零了,第一位前面的那个一因为无法表示舍去了。最后就是两个负数相加结果是正数,溢出啦。

说明加法器工作的原理。比如

-20的二进制补码 = 11101100       -25的二进制补码 = 11100111
              -20             11101100
           +(-25)    =    + 11100111
              -45            111010011
超出的最高位去掉后 = 11010011
-45 的补码刚好是 11010011,所以以上式子正确。
这个是说用两个符号位表示时,溢出可以有机器判断了http://www.softwarehistory.net/h/E_Comp_ZuchengYuanli/28.php

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值