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

原文:【 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

 

时间: 2024-09-17 04:24:58

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

深入分析C语言中的有符号和无符号

就像我们必须决定某个量使用整数还是实数,使用多大的范围数一样,我们必须自已决定某个量是否需要正负.如果这个量不会有负值,那么我们可以定它为带正负的类型. 在计算机中,可以区分正负的类型,称为有符类型(signed),无正负的类型(只有正值),称为无符类型. (unsigned)数值类型分为整型或实型,其中整型又分为无符类型或有符类型,而实型则只有符类型. 字符类型也分为有符和无符类型. 比如有两个量,年龄和库存,我们可以定前者为无符的字符类型,后者定为有符的整数类型. 2.使用二制数中的最高位表

c语言中向二维字符数组中写入符号*

问题描述 c语言中向二维字符数组中写入符号* 声明一个二维字符数组char str[][]: 通过循环嵌套向里面写入符号 * 怎么实现?求前辈指教. 解决方案 for (int i = 0; i < 100; i++) { arr[i / 10][u % 10] = ' '; } for (i =0; i < 10; i++) { arr[3][i] = '*'; arr[4][i] = '*'; arr[i][3] = '*'; arr[i][4] = '*'; } 解决方案二: 只要一行

C语言无符号长整型的左移运算

问题描述 C语言无符号长整型的左移运算 C语言(VC6.0)的无符号长整型是如何左移的,当左移的位数超过该数值类型的最大位数是怎么样处理的?求大神解答,不甚感激 解决方案 C语言左移运算符是<<,左移赋值运算符是<<= 左移运算根据您机器的位长,如32位.64位机器把long型数据转换成相应的二进制值.unsigned long不会转换为反码. //给您个例子32位机器 unsigned long lValue = 8L; //这时lValue的二进制制编码是00000000000

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

首先我表示很悲剧,在看<程序员的自我修养--链接.装载与库>之前我竟不知道C有强符号.弱符号.强引用和弱引用.在看到3.5.5节弱符号和强符号时,我感觉有些困惑,所以写下此篇,希望能和同样感觉的朋友交流也希望高人指点. 首先我们看一下书中关于它们的定义. 引入场景:(1)文件A中定义并初始化变量i(int i = 1), 文件B中定义并初始化变量i(int i = 2).编译链接A.B时会报错b.o:(.data+0x0): multiple definition of `i':a.o:(.d

jsp页面中表达式语言中的$符号不起作用的解决方法_JSP编程

今天myeclipse里部署了之前做的一个测试项目,发现jsp里的$符号tomcat启动后页面上显示出来了,百度搜了下别人也有类似的问题出现过.经提醒原来是web.xml配置的version设置的是2.5而我tomcat5启动的.是tomcat的版本低于web的版本,从而导致$符号不能正常使用. 后将tomcat5改用tomcat6.jdk采用1.6 启动spring2.5项目.$显示问题解决. 以下是网上摘录的详细说明: 在jsp页面中用表达式语言中的$符号,如${pageScope.titl

新手小心:c语言中强符号与弱符号的使用_C 语言

声明:下面的实例全部在linux下尝试,window下未尝试.有兴趣者可以试一下.文章针c初学者.c语言的强符号和弱符号是c初学者经常容易犯错的地方.而且很多时候,特别是多人配合开发的程序,它引起的问题往往非常行为怪异而且难以定位.什么是强符号和弱符号?在c语言中,函数和初始化的全局变量是强符号,未初始化的全局变量时弱符号.强符号和弱符号的定义是连接器用来处理多重定义符号的,它的规则是:不允许多个强符号:如果一个强符号和一个弱符号,这选择强符号:如果多个弱符号,则任意选一个.它的陷阱:上代码:

浅谈C语言中的强符号、弱符号、强引用和弱引用【转】

转自:http://www.jb51.net/article/56924.htm 首先我表示很悲剧,在看<程序员的自我修养--链接.装载与库>之前我竟不知道C有强符号.弱符号.强引用和弱引用.在看到3.5.5节弱符号和强符号时,我感觉有些困惑,所以写下此篇,希望能和同样感觉的朋友交流也希望高人指点. 首先我们看一下书中关于它们的定义. 引入场景:(1)文件A中定义并初始化变量i(int i = 1), 文件B中定义并初始化变量i(int i = 2).编译链接A.B时会报错b.o:(.data

C语言中的强符号和弱符号介绍_C 语言

之前在extern "C" 用法详解中已经提到过符号的概念,它是编译器对变量和函数的一种标记,编译器对C和C++代码在生产符号时规则也是不一样的,符号除了本身名字的区别外,还有强符号和弱符号之分 我们先看一段简单的代码 复制代码 代码如下: /* test.c */  void hello();  int main()  {      hello();      return 0;  }  很显然,这段代码是没法链接通过的,它会报错undefined reference to hell

PPT中怎么绘制双音符符号?

PPT中怎么绘制双音符符号?   1.新建一个PPT,新建一个空幻灯片.在桌面上新建一个新的PPT ,然后打开,再新建一个新的幻灯片,等会就在这个新的幻灯片来做这个双音符符号. 2.选择最顶部的导航栏上的插入,形状 .点击导航栏 上的插入,然后找到形状,点击进去. 3.选择椭圆形 .在形状中找到椭圆形,点击这个椭圆形的图案,双音符就是用这椭圆形来制作的.