原文:【 c语言中无符号和有符号的加法运算】【深入理解】--【sky原创】

 
第一题

#include<stdio.h> 
int main() 

unsigned int a=6; 
int b=-20; 
printf("%d\n",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\n",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

 

【 c语言中无符号和有符号的加法运算】【深入理解】--【sky原创】的更多相关文章

  1. C语言中无符号数和有符号数之间的运算

    C语言中无符号数和有符号数之间的运算 C语言中有符号数和无符号数进行运算(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数,逻辑运算当然是返回0或1了. un ...

  2. 在JavaScript中"+"什么时候是链接符号,什么时候是加法运算?

    二元加法运算符“+”在两个操作数都是数字或都是字符串时,计算结果是显而易见的.加号“+”的转换规则优先考虑字符串连接,如果其中一个操作数是字符串或者转换为字符串的对象,另外一个操作数会转换为字符串,加 ...

  3. C语言中无符号与有符号问题

    unsigned char a[5] = { 12,36,96,128,182 }; a[]范围为0~256. 数组中数都有效. char a[5] = { 12,36,96,128,182 }; a ...

  4. c语言中为什么左移不分符号数无符号数,而右移分呢??

    因为在C语言标准中,只规定了无符号数的移位操作是采用逻辑移位(即左移.右移都是使用的逻辑左移和逻辑右移).而对于有符号数,其左移操作还是逻辑左移,但右移操作是采用逻辑右移还是算术右移就取决于机器了!( ...

  5. C语言不使用加号实现加法运算的几种方法

    今天看到<编码:隐匿在计算机软硬件背后的语言>的第十二章:二进制加法器.讲述了全加器,半加器的原理以及如何实现加法.实现加法时所使用的全加器,半加器中包含的所有逻辑门在C语言中都有相应的运 ...

  6. 栈在go语言中实现,及解决388.文件的最长绝对路径的思路

    今天在LeetCode刷每日一题,遇到了388. 文件的最长绝对路径的思路,这道题让我想到了系统的目录是栈结构,果然在题解中找到了栈的解法(暴力半天没出来,跑去看题解了QWQ). 所以我就捎带复习了一 ...

  7. Java-java中无符号类型的处理

    在Java中,不存在Unsigned无符号数据类型,但可以轻而易举的完成Unsigned转换. 方案一:如果在Java中进行流(Stream)数据处理,可以用DataInputStream类对Stre ...

  8. java中无符号类型的处理

    在Java中,不存在Unsigned无符号数据类型,但可以轻而易举的完成Unsigned转换. 方案一:如果在Java中进行流(Stream)数据处理,可以用DataInputStream类对Stre ...

  9. 浅谈C语言中的强符号、弱符号、强引用和弱引用

    摘自http://www.jb51.net/article/56924.htm 浅谈C语言中的强符号.弱符号.强引用和弱引用 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2014- ...

随机推荐

  1. LeetCode——Pascal&#39;s Triangle

    Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5, Retu ...

  2. Oracle SQL 调优健康检查脚本

    Oracle SQL 调优健康检查脚本 我们关注数据库系统的性能,进行数据库调优的主要工作就是进行SQL的优化.良好的数据架构设计.配合应用系统中间件和写一手漂亮的SQL,是未来系统上线后不出现致命性 ...

  3. 2年SQL Server DBA调优方面总结

    原文:2年SQL Server DBA调优方面总结 2年SQL Server DBA调优方面总结 当2年dba 我觉得,有些东西需要和大家分享探讨,先书单. 书单 1.<深入解析SQL Serv ...

  4. 【BZOJ3627】【JLOI2014】路径规划 分层图

    意甲冠军:要查找.有门户网站:http://www.lydsy.com/JudgeOnline/problem.php? id=3627 注意:点的等待时长示意图为: 非常清晰了吧?没事,不清晰就不清 ...

  5. 新安装Win10

    随着微软发布Windows 10下载技术预览版.现在,您可以免费下载Windows 10技术预览ISO档,安装和开放经验. Windows 10技术预览提供的第一部英语.中国简体.葡萄牙语,含32位. ...

  6. Java Web整合开发(4) -- JSP

    JSP脚本中的9个内置对象: application:    javax.servlet.ServletContext config:          javax.servlet.ServletCo ...

  7. Angularjs,WebAPI 搭建一个简易权限管理系统

    Angularjs,WebAPI 搭建一个简易权限管理系统 Angularjs名词与概念(一)   1. 目录 前言 Angularjs名词与概念 权限系统原型 权限系统业务 数据库设计和实现 Web ...

  8. VisualStudio 怎么使用Visual Leak Detector

    VisualStudio 怎么使用Visual Leak Detector 那么在Windows下有什么好的内存泄漏检测工具呢?微软提供Visual Studio开发工具本身没有什么太好的内存泄漏检测 ...

  9. Java得到的一周的最后一天的一段时间内

    Java得到的一周的最后一天的一段时间内 1.设计源代码 LastDayOfWeek.java: /** * @Title:LastDayOfWeek.java * @Package:com.you. ...

  10. 图解zookeeper FastLeader选举算法

    zookeeper当配置为群集模式,在启动或异常情况将被选举为的例子Leader.默认选择算法FastLeaderElection. 不知道zookeeper够考虑这样一个问题:某个服务能够配置为多个 ...