zoukankan      html  css  js  c++  java
  • 【 c语言中无符号和有符号的加法运算】【深入理解】--【sky原创】

     
    第一题

    #include<stdio.h> 
    int main() 

    unsigned int a=6; 
    int b=-20; 
    printf("%d ",a+b); 
    (a+b)>6? puts(">6"):puts("<=6"); 
    return 0; 

    答案是:>6
     
    第二题
    #include<stdio.h> 
    int main() 

    unsigned int a=6; 
    int b=-2; 
    printf("%d ",a+b); 
    (a+b)>6? puts(">6"):puts("<=6"); 
    return 0; 
    答案是: <=6
     
    很多有经验的工程师看到此题目以后会觉得两个答案都是大于6,那么就想当然啦,这是我们很多人会出错的一个题,计算机告诉我们不要相信直觉,要动手算算。
     
    首先先说明几点:
    1、有符号和无符号相加的运算,unsigned int 要比int 的级别要高,因此在做加法运算时会自动隐式转换为unsigned int , 注意的是,负数在转换的时候补码是不变的
    2、负数在进行运算的时候是以补码进行运算的,先写出-2的二进制,就是最高位为1,即1000 0000 0000 0010
    这是在32位系统下的,那么补码就是取反加1
    1111 1111 1111 1101     --->  1111 1111 1111 1110
    对于正数来说 6 的补码就是本身,也就是 0000 0000 0000 0110
     
    6+ (-2)就可以算啦,结果是4 ,那为什么这么小呢,可不是6-2=4这样理解喔,很多人误以为会算出很大的数是因为最高位为1,那么就很大了,但是如果相加起来的话,例如这个例子,最高位已经溢出了,溢出的数就要舍去,因此答案才为4,至于第一题为什么会大于6原理是一样的,我就不多说了。
     
    欢迎交流

    新浪博客:http://blog.sina.com.cn/u/2049150530
    博客园:http://www.cnblogs.com/sky-heaven/
    知乎:http://www.zhihu.com/people/zhang-bing-hua

     
  • 相关阅读:
    HDU1862 EXCEL排序
    结构体+字符串比较大小(HDU1234开门人和关门人 )
    两个大数字相加
    Ksusha and Array (vector)
    Ksenia and Pan Scales(思维题)
    最大公约数问题(Wolf and Rabbit )
    HDU2044一只小蜜蜂(递推)
    HDU2043密码
    基础贪心算法(HDU2037今年暑假不AC)
    c# winform 关于DataGridView的一些操作(很全,绝对够用)
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/4153604.html
Copyright © 2011-2022 走看看