作者 : 卿笃军

一道unsigned int与int类型的相加题目。引发了我对这个问题的思考。

首先要明确两个问题:

问题一、

unsigned int
int
究竟哪个能表达出来的数上限大呢?

答:当然是unsigned int

为什么?

答:由于。int将最高位看做是符号位。0表示'正',1表示'负'。也就是说,最高位不能用来存值。

问题二、

当计算机进行两数相加的时候会怎样进行类型转换呢?

答:当然是将上限小的转化为上限大的咯。(就是将int类型转化为unsigned int类型)。

为什么?

答:我们知道int + double 会所有转化为double型相加。而计算机在进行两数相加的时候,为了避免数据溢出,就转化为上限较大的类型进行操作了~~~

以下,我们以32位机上面的加法进行分析:

演示样例:

unsigned int a = 0;

int b = -1;

a + b = ?

第一步:将int b  = -1;转化为unsigned int 类型,就是将最高位的符号位1看成是存放的值。

那么-1在内存中是怎样存放的呢?

答:-1就是,1取反然后—+1;

32位机,就是4*8 = 32(8个字节,每一个字节占4位);

1        2        3        4      5       6          7        8

1的二进制原码:0000 0000 0000 0000 0000 0000 0000 0001

1的二进制取反:1111 1111 1111 1111 1111 1111 1111 1110

1二进制取反+1:  1111 1111 1111 1111 1111 1111 1111 1111   这就是-1在内存中的存放形式

而1111 1111 1111 1111 1111 1111 1111 1111(二进制)   =  4294967295(十进制)

第二步:运行a+b操作

所以,上面的问题就转化为了 4294967295 + 0 = ?

非常显然结果就是:4294967295

附上C语言代码:

#include <stdio.h>

int main()
{
unsigned int a = 0;
int b = -1; printf("%u\n",a+b); return 0;
}

參考文献:随心的博客园,unsigned与int相加的问题,http://www.cnblogs.com/yanglf/archive/2012/11/07/2759412.html

unsigned int与int相加问题的更多相关文章

  1. unsigned int与int相加的问题-----C/C++小知识 区别

    http://blog.csdn.net/thefutureisour/article/details/8147277 #include "stdafx.h" int _tmain ...

  2. 关于unsigned int和int的加法

    补码(two's complement) 在计算机系统中,数值一律用补码来表示和存储.原因在于,使用补码,可以将符号位和数值域统一处理:同时,加法和减法也可以统一处理.此外,补码与原码相互转换,其运算 ...

  3. 对unsigned int和int进行移位操作的区别

    1. 无符号整数 unsigned int 对unsigned int进行移位操作时,最高位不会有任何特殊性. 无符号整数必须使用%u来打印 #include <stdio.h> int ...

  4. 深入解剖unsigned int 和 int

    就如同int a:一样,int 也能被其它的修饰符修饰.除void类型外,基本数据类型之前都可以加各种类型修饰符,类型修饰符有如下四种: 1.signed----有符号,可修饰char.int.Int ...

  5. double转换为int以及浮点型相加损失精度问题

    最近在做支付相关模块的业务,数据库字段却使用的是double类型,其实也行,只要计算不在sql语句中进行,也是没有问题的. 预先的类属性设置的是Double类型,自己算的时候发现小数相加会出现损失精度 ...

  6. unsigned int 和 int

    就如同int a:一样,int 也能被其它的修饰符修饰.除void类型外,基本数据类型之前都可以加各种类型修饰符,类型修饰符有如下四种:1.signed----有符号,可修饰char.int.Int是 ...

  7. jni java和C之间的值传递(int String int[])

    我们通过jni调用C代码不可能每次只是去调一个方法,通常,我们需要传递一些值过去. 例如,播放电影,那就肯定需要你把电影的 url给 C的播放器吧,等等. 接下来就看一看怎么去传递这些值: 首先是最简 ...

  8. Power(int base, int exponent) 函数实现

    这个是个高效的算法,时间复杂度为 O(logn) 原理: a的n次方: #include<iostream> #include<cmath> using namespace s ...

  9. const int *p;int *const p;区别及用法

    在单片机程序设计中,我们经常会用到const这个关键字,在有些单片机的编译器中可能会是code(比如51系列单片机),但我们在学习C语言的时候,首先还是先学到的const.我们知道,const关键字的 ...

随机推荐

  1. 用户空间缺页异常pte_handle_fault()分析--(下)--写时复制【转】

    转自:http://blog.csdn.net/vanbreaker/article/details/7955713 版权声明:本文为博主原创文章,未经博主允许不得转载. 在pte_handle_fa ...

  2. Linux安转jdk

    1. 创建目录 > mkdir  /opt/java > cd /opt/java 2. 下载jdk压缩包到上述目录 jdk-8u162-linux-x64.tar.gz 3. 解压缩.建 ...

  3. 你不一定知道的、并没有什么卵用的一些python库

    1. delorean,用来处理时间的库 import datetime import pytz # 一般情况下,我们想表示时间的话 est = pytz.timezone("Asia/Sh ...

  4. 【C语言】复杂类型声明

    原文地址: http://blog.csdn.net/wangweixaut061/article/details/6549768 原文不让转载,但实在是有用,就拷贝了一小部分过来.全文请点开链接. ...

  5. 2018 JUST Programming Contest 1.0 题解

    题目链接  gym101778 Problem A 转化成绝对值之后算一下概率.这个题有点像 2018 ZOJ Monthly March Problem D ? 不过那个题要难一些~ #includ ...

  6. Codeforces 581F Zublicanes and Mumocrates(树型DP)

    题目链接  Round 322 Problem F 题意  给定一棵树,保证叶子结点个数为$2$(也就是度数为$1$的结点),现在要把所有的点染色(黑或白) 要求一半叶子结点的颜色为白,一半叶子结点的 ...

  7. [HDU6240]Server

    题目大意: 用$n$条线段覆盖区间$[1,t]$上的整点.每条线段有4个属性$(S_i,T_i,A_i,B_i)$,表示用第$i$条线段可以覆盖区间$[S_i,T_i]$.若选取线段的集合为$S$,最 ...

  8. Tiny4412在Ubuntu下给MiniTools添加快捷方式

    解压MiniTools-Linux-20140317.tgz root@ubuntu:~/tiny4412/MiniTools-# ls -l total -rw-r--r-- root root M ...

  9. JAVA实现网页快照,存为图片格式

    原文:http://blog.csdn.net/java2000_net/article/details/3643528 截取的google的效果,将就吧,不是特别好. 但是作为普通的应用,我想这个效 ...

  10. powerdesigner操作

    转:http://w-tingsheng.blog.163.com/blog/static/25056034201392331452977/ 使用PowerDesigner生成数据库建表SQL脚 本时 ...