码迷,mamicode.com
首页 > 其他好文 > 详细

变量定义类型长度的理解

时间:2015-06-22 23:30:59      阅读:418      评论:0      收藏:0      [点我收藏+]

标签:

1 字节 = 8位 
int型 2字节 = 16位

按VC++和C++的规定,int和long等长,都是32位的。short才是16位的。只有原始的C才定义int和short等长为16位。 

这个数据范围指的确实是具体 int的取值范围,但不是你理解的那样。 
现在以16位的short为例。 
首先必须清楚一个概念,计算机中存放的数据都是以二进制形式存放的。short存放的是整型数据,是用固定位数16个二进制位来表示一个整数,不足16位补0。 
比如125的二进制是1111101,那么在内存中存放就是 
0000 0000 0111 1101 

那么16个二进制位能够表示多少种不同的整数呢?稍微用点数学常识就知道,是2的16次方,也就是65536个不同的整数。所以对于无符号整数,unsigned short的范围就是0~65535。 
而为了表示负数,计算机用short的第一位作为符号位来表示正负。注意,计算机中是以补码的形式存放整数的。对于正数,补码是其本身;对于负数,其补码是对其绝对值的按位取反,再加1的结果。 
举个简单的例子: 
125是0000 0000 0111 1101 
-125计算过程: 
125是0000 0000 0111 1101 
按位取反,1111 1111 1000 0010 
再加1,1111 1111 1000 0011 
所以-125就是1111 1111 1000 0011。 
补码不是三言两语能讲得清楚的,楼主有个概念即可。 
我们发现,正数的补码首位都是0,负数的补码首位都是1。 
short有符号型的范围是-32768~32767。 

那么,如果超出了范围,会发生什么现象呢? 
很简单,这称为溢出。 
比如short a = 32768 
32768是1000 0000 0000 0000。还记得我讲过吗?正数的补码首位都是0,但这里首位为1,这是怎么回事呢?其实因为浪费了1位做符号位,short的有效位数只是15位而已,而2的15次方是32768,因此正数的范围是0~32767,32768超出了范围,计算机怎么处理呢?结果就是把它当作负数,根据补码计算它的原码。反过来即可 
1000 0000 0000 0000 减1, 
0111 1111 1111 1111 再按位取反, 
1000 0000 0000 0000 就是32768 
所以1000 0000 0000 0000表示-32768 
也就是说short a = 32768;把a输出来得到-32768楼主可以试验一下。 

再举一例: 
unsigned short a=65536; 
65536是1 0000 0000 0000 0000 注意这已经是17位了。计算机会自动截取后面的16位 
就是得到0000 0000 0000 0000,也就是0 
所以unsigned short a=65536;输出a得到0。 
明白了吗?


变量定义类型长度的理解

标签:

原文地址:http://my.oschina.net/u/2379244/blog/469542

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!