作者 : 卿笃军

一道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. Js 利用正则表达式和replace函数获取string中所有被匹配到的文本

    js的replace函数除了替换文本以外还有获取所有被正则表达式匹配到的文本的功能.这里以一个简单的案例来作为演示. 利用正则查找出所有被两个花括号包裹的字符串: var str = '<div ...

  2. (1)OracleClient数据库操作(淘汰)

    一.数据库连接 Oracle 数据提供程序,位于System.Data.OracleClient 命名空间.( .NET 4 以后的版本,会将不在维护和更新了) 第一步:引入命名空间 在程序的开头写上 ...

  3. Job的使用

    1.Job完成状态监听: job.addJobChangeListener(new JobChangeAdapter() {            @Override            publi ...

  4. 洛谷—— P3908 异或之和

    https://www.luogu.org/problemnew/show/P3908 题目描述 求1 \bigoplus 2 \bigoplus\cdots\bigoplus N1⨁2⨁⋯⨁N 的值 ...

  5. JDBC-登陆功能实现

    1.user.java package songyan.jdbc.entity; import java.util.Date; public class User { private int id; ...

  6. SQL Server 获取日期是星期周几(默认从周日开始到周六 1-7)

    ALTER FUNCTION [dbo].[GetWeekDay] ( @Year INT, @Month INT ,@Day INT ) RETURNS INT AS BEGIN DECLARE @ ...

  7. 在K8s中创建StatefulSet

    在K8s中创建StatefulSet 遇到的问题: 使用Deployment创建的Pod是无状态的,当挂在Volume之后,如果该Pod挂了,Replication Controller会再run一个 ...

  8. 设计模式之建造者模式(php实现)

    github地址:https://github.com/ZQCard/design_pattern/** * 建造者模式 * 将一个复杂对象的建造与调用者分离.调用者只需要给出指定对象的类型和内容,建 ...

  9. python下性能提示

    性能提示 3.1 嵌套if/else结构比一系列单选if结构块,因为只要有一个条件满足,其余测试就会终止. 3.2 在嵌套if/else结构中,把最可能成立的条件放在该嵌套结构的开始处.和把不常见的条 ...

  10. Java多线程——线程安全问题

    一.什么情况下会产生线程安全问题? 同时满足以下两个条件时: 1,多个线程在操作共享的数据.2,操作共享数据的线程代码有多条. 当一个线程在执行操作共享数据的多条代码过程中,其他线程参与了运算,就会导 ...