• 【 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

     
  • 相关阅读:
    13 款开源的全文检索引擎
    Laravel5.5 Jwt 1.0 beta 配置
    Laravel SQL 查询语句集锦
    laravel在中间件内生成的变量如何传到控制器
    laravel中的自定义函数的加载和第三方扩展库加载
    laravel5.5 dingo/api+jwt-auth
    微信小程序之使用checkbox
    微信小程序之使用wx:for遍历循环
    微信小程序之页面导航栏
    微信小程序之数据缓存
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/4153604.html
Copyright © 2020-2023  润新知