unsigned int与int相加问题
来源:互联网 发布:c语言程序小游戏 编辑:程序博客网 时间:2024/05/29 17:36
作者 : 卿笃军
一道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相加问题
- unsigned int与int相加
- unsigned int与int相加如何转化问题
- 浅谈unsigned int与int相加的问题
- unsigned int 和int 相加问题
- 由int与unsigned int 相加看c++类型转换
- 由int与unsigned int 相加看c++类型转换
- 由int与unsigned int 相加看c++类型转换
- 由int与unsigned int 相加看c++类型转换
- unsigned int 与 int
- unsigned int与int
- unsigned int 与 int 之和
- int 与 unsigned int (uint) 比较时出现的问题
- [C语言]unsigned int与 int
- int 与 unsigned int 移位运算
- mysql int unsigned负数问题
- 关于unsigned int的 问题
- 练习1-3
- 动景科技(UC浏览器)与合一信息技术(优酷网)不正当竞争案管辖权异议裁定书
- Nyoj 745 蚂蚁的难题(二)
- 体验继承
- leetcode Longest Common Prefix
- unsigned int与int相加问题
- [Wikioi 1025][NOIP 2003普及组]数字游戏
- 算数表达式求值
- Oracle中TO_DATE TO_CHAR格式
- 编码实现环状单向链表(尾指针直接指向头指针,中间没有空节点),去除连续的重复元素的操作
- Android 中使用 XML 中的 fragment 心得
- 线性表的链式存储(单链表)的c语言实现
- 字符串问题python实现(一)
- UVa 100 The 3n + 1 problem