补码——为cpu运算产生的补码

以下代码的执行结果是().
int main(){
    int i=-2147483648;
    return printf ( "%d,%d,%d,%d" ,~i,-i,1-i,-1-i);
}
链接: https://www.nowcoder.com/questionTerminal/5f5f30bea94748fe903ff5616e73de00
来源:牛客网

  • 0,2147483648,2147483649,2147483647
  • 0,-2147483648,-2147483647,2147483647
  • 2147483647,2147483648,2147483649,2147483647
  • 2147483647,-2147483648,-2147483647,2147483647

       我不知道自己理解的有没有问题,这一题我第一次是选错了,选的C,之所以选错原因是因为不知道-2147483648是整数的下限,我理解的补码都是为计算机做加法运算做准备的。
        对!补码的出现是对加法运算做准备的,任何数(包括正数负数)之间的运算只需要按照简单的逻辑:异或运算、与运算、移位运算、按位取反等最终实现加法。因而一个数无论正负,它的补码如果按照 按位取反再加1 的法则得出的数必定是其相反数的补码,不信的可以自己去尝试,当然这里说的按位取反是计算机cpu里面的按位取反(所有的位全部取反,谁管你是不是正数负数),这里说的加1运算也仅仅是计算机里面的跟1的补码做加法运算。这就是补码!!!为了运算而生的补码,正数按照补码按位取反再加一得到其相反数,负数也是一样。这样就出现了 0X00000000的相反数等于自身,0X80000000的相反数也等于自身。 0X00000000的相反数之所以是等于自身是因为有了溢出的情况。那么哪一个应该去表示0呢?因为0的相反数为0啊,这两个都满足怎么办?那么这时候出现了一个规定,就是说第一位为1的数为负数。这时候你可能会想为什么第一位1的就要为负数呢??为什么第一位为1的不是正数呢???难道就仅仅是简简单单的规定吗????当然不是咯,你想过没有?如果规定第一位为1的为正数,很多两个正数在计算机的cpu里面做加法运算(一系列的异或运算、与运算、移位运算、按位取反实现)的时候就会得到一个非正数,比如1+1,补码表示是0X80000001+0X80000001,。因为最高为的1做完运算之后得到0,最高位为0就代表了非正,所以说负数的最高位要为1,你这时候会想难道这样就能避免两个负数相加得到一个正说或者两个正数相加得到一个负数??当然不会避免,因为计算机的计算方法是永远不会改变的,但是出现这种情况的时候时候你会知道我计算的数值超出了整数的范围,比如两个整数2000000000+2000000000,当然会得出一个负数啦,不信自己尝试一下,因为你越界了,或者-2000000000-2000000000可能会得到一个正数。至少定义补码第一位为1的时候该数为负数,比定义补码第一位为1的时候该数为正数强。因为定义补码第一位为1的时候该数为正数的时候,来一个int a = 1; int b = 1; int c = a+b;然后得出c是一个负数让人容易接受。
这时候长篇大论扯了这么多,这些就是自己一直理解的补码,看的书里面具体内容都忘了,计算规则也忘了,我就记得了按位取反加一得到相反数的补码是补码的特征,而且计算机都是按照补码进行简单的移位与或非运算的。
     ~i是多少呢?~i+1 = -i = 2147483648,经过上面的一大段话,这个式子没问题吧,那么很容易得出~i= 2147483647,那-i,1-i,-1-i呢,-i = 2147483648这个正数在整数里面越界了,但是在计算机的cpu里面计算得到的结果2147483648就不要赋值给一个整数了吗?当然要赋值。那么看看-2147483648在计算机里面的表示是1000 0000  0000 0000    0000 0000  0000 0000,按位取反再加1,还是一样的1000 0000  0000 0000    0000 0000  0000 0000,也就是说在计算机里面计算出来的2147483648是张这样的1000 0000  0000 0000    0000 0000  0000 0000,也就是整数里面的-2147483648,1-i那当然就是1+(-2147483648) = -2147483647, -1-i呢就是1000 0000  0000 0000    0000 0000  0000 0000+1111 1111  1111 1111    1111 1111  1111 1111 = 0111 1111  1111 1111    1111 1111  1111 1111,赋值给一个整数也就是2147483647咯。没了,这就是这一题,没有规定0X80000000应该为最小的负数、而0X00000000为0,一切都有因果,没有规定!!!都有因果!!!!因为这样计算机才能计算!!!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值