C语言基本整型的数据范围什么意思

书上写:基本整型变量所占字节数为2数据范围是-32768----32767可是一个数字占字节数就为1字节如果存32767不是占了5个字节了么?为什么数据范围是-32768... 书上写:
基本整型变量 所占字节数为2 数据范围是-32768----32767

可是一个数字占字节数就为1字节
如果存32767不是占了5个字节了么?

为什么数据范围是-32768----32767?????
想了很久没想通。。。
展开
 我来答
xndcn
推荐于2017-10-11 · TA获得超过826个赞
知道小有建树答主
回答量:287
采纳率:0%
帮助的人:432万
展开全部
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://zhidao.baidu.com/question/44463080.html

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
听不清啊
高粉答主

推荐于2018-03-25 · 说的都是干货,快来关注
知道顶级答主
回答量:7.8万
采纳率:89%
帮助的人:1.9亿
展开全部
对于无符号数,根据占用的位数可以直接计算:
unsigned short 16位 0~2的16次方-1(即65535)
unsigned int 16位 0~2的16次方-1(即65535)
unsigned long 32位 0~2的32次方-1(即4294967295)

对于有符号数,由于0也占用一个位置,导致负数的边界值与正数的边界值不一样:
short 16位 - 2的(16-1)次方~2的(16-1)次方-1(即-32768~32767)
int 16位 - 2的(16-1)次方~2的(16-1)次方-1(即-32768~32767)
long 32位 - 2的(32-1)次方~2的(32-1)次方-1(即-2147483648~2147483647)
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Wenjinguang
2008-01-24 · TA获得超过642个赞
知道小有建树答主
回答量:214
采纳率:52%
帮助的人:145万
展开全部
应该是这样的,在计算机中信息是用二进制数来表示的,2个字节就是16位的二进制数,所以16位的二进制数可以表示数据范围-32768--32767了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
吃亏吃亏不用之8197
2008-01-24 · TA获得超过351个赞
知道小有建树答主
回答量:893
采纳率:0%
帮助的人:0
展开全部
没有问题啊 你没学好吧?
1 字节 = 8位
int型 2字节 = 16位
其实现在已经完全不是了。新的标准 int 型所占空间随编译器而变,现在已经都是32位的了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
朝日其升8
2018-03-25
知道答主
回答量:2
采纳率:0%
帮助的人:1629
展开全部
计算机中存是用二进制补码存的2个字节就是16位二进制数,有符号数符号占一位,15位二进制换算成十进制就是32767咯,至于有符号数的正负最值不同就涉及到负数补码的表示问题了,反正你知道这个32767是二进制来的就好
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式