Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2603486
  • 博文数量: 877
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5920
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-05 12:25
个人简介

技术的乐趣在于分享,欢迎多多交流,多多沟通。

文章分类

全部博文(877)

文章存档

2021年(2)

2016年(20)

2015年(471)

2014年(358)

2013年(26)

分类: IT职场

2014-12-04 13:51:55


unsigned int与int相加问题

作者 : 卿笃军

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

首先要明白两个问题:

问题一、

unsigned int 和 int 到底哪个能表达出来的数上限大呢? 

答:当然是 unsigned int 。

为什么?

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

 char和uchar相加,一律转成int,以不失精度的原则,两个char相加有可能多于一字节,所以要统统为int 

问题二、

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

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

为什么?

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

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

示例:

int b = -1;

a + b = ?

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

那么-1在内存中是如何存放的呢?

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

32位机,就是4*8 = 32;

                                  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(十进制)

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

很显然结果就是:4294967295

附上C语言代码:

#include  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

阅读(1045) | 评论(0) | 转发(0) |
0

上一篇:暗时间

下一篇:printf参数提升

给主人留下些什么吧!~~