unsigned int与int相加问题
作者 : 卿笃军
一道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相加问题的更多相关文章
- unsigned int与int相加的问题-----C/C++小知识 区别
http://blog.csdn.net/thefutureisour/article/details/8147277 #include "stdafx.h" int _tmain ...
- 关于unsigned int和int的加法
补码(two's complement) 在计算机系统中,数值一律用补码来表示和存储.原因在于,使用补码,可以将符号位和数值域统一处理:同时,加法和减法也可以统一处理.此外,补码与原码相互转换,其运算 ...
- 对unsigned int和int进行移位操作的区别
1. 无符号整数 unsigned int 对unsigned int进行移位操作时,最高位不会有任何特殊性. 无符号整数必须使用%u来打印 #include <stdio.h> int ...
- 深入解剖unsigned int 和 int
就如同int a:一样,int 也能被其它的修饰符修饰.除void类型外,基本数据类型之前都可以加各种类型修饰符,类型修饰符有如下四种: 1.signed----有符号,可修饰char.int.Int ...
- double转换为int以及浮点型相加损失精度问题
最近在做支付相关模块的业务,数据库字段却使用的是double类型,其实也行,只要计算不在sql语句中进行,也是没有问题的. 预先的类属性设置的是Double类型,自己算的时候发现小数相加会出现损失精度 ...
- unsigned int 和 int
就如同int a:一样,int 也能被其它的修饰符修饰.除void类型外,基本数据类型之前都可以加各种类型修饰符,类型修饰符有如下四种:1.signed----有符号,可修饰char.int.Int是 ...
- jni java和C之间的值传递(int String int[])
我们通过jni调用C代码不可能每次只是去调一个方法,通常,我们需要传递一些值过去. 例如,播放电影,那就肯定需要你把电影的 url给 C的播放器吧,等等. 接下来就看一看怎么去传递这些值: 首先是最简 ...
- Power(int base, int exponent) 函数实现
这个是个高效的算法,时间复杂度为 O(logn) 原理: a的n次方: #include<iostream> #include<cmath> using namespace s ...
- const int *p;int *const p;区别及用法
在单片机程序设计中,我们经常会用到const这个关键字,在有些单片机的编译器中可能会是code(比如51系列单片机),但我们在学习C语言的时候,首先还是先学到的const.我们知道,const关键字的 ...
随机推荐
- super真的是调用父类吗?
#!/usr/bin/env python # -*- coding:utf-8 -*- # author:love_cat class A: def __init__(self): print(&q ...
- AC日记——[HNOI2012]永无乡 bzoj 2733
2733 思路: 启发式合并splay(n*log^2n): 来,上代码: #include <cstdio> #include <cstring> #include < ...
- typescript项目配置路径别名(路径映射)
在vue项目中,我们可以利用“@”来指代src目录,在普通webpack项目中,我们也可以通过配置webpack的config来指定路径别名,但是在typescript+webpack项目中我们该怎么 ...
- (9)oracle 表的基本查询
转到进阶查询 查看表的结构 desc 表名; desc student; 查看整张表的数据 select * from 表名; //查整张表很耗时间 select* from student; 查看 ...
- 牛客网暑期ACM多校训练营(第一场) - J Different Integers(线段数组or莫队)
链接:https://www.nowcoder.com/acm/contest/139/J来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语言1048 ...
- Codeforces 246E - Blood Cousins Return (树上启发式合并)
246E - Blood Cousins Return 题意 给出一棵家谱树,定义从 u 点向上走 k 步到达的节点为 u 的 k-ancestor,每个节点有名字,名字不唯一.多次查询,给出 u k ...
- shell spool
If you wish to use SQL*Plus Command-line , you'll simply issue the sqlplus command from your shell: ...
- SimpleDateFormat关于时间类的一些常用处理
项目中经常会出现对时间类的一些处理,记录一下: 实例一:/** * 获取当前时间是星期几? * * @param args */ public static void main(String[] ar ...
- npm中package-lock.json的作用:npm install安装时使用
简单理解: XYZ 的格式 对应为: 主版本号.次版本号.修订号,版本号递增规则如下: 主版本号:当你做了不兼容的 API 修改, 次版本号:当你做了向下兼容的功能性新增, 修订号:当你做了向下兼容的 ...
- linux 多线程那点事
说明:对多线程与相互排斥锁不熟悉的请參考其他 #include <pthread.h> #include <stdio.h> #include <stdlib.h> ...