c语言中int取值范围-2的15次方至2的15次方减1,为什么要减1 100

 我来答
风25信子
推荐于2017-11-22
知道答主
回答量:19
采纳率:0%
帮助的人:4.2万
展开全部
int型 在16位的C编译器 占2字节;32位和64位的编译器通常是4字节。
如果是占2字节则为16位的二进制数,其中最高位为符号位,1为负,0为正;
所以正整数中最大的数为0111111111111111 即2的15次方-1
而负整数则比较特殊 最小为1000000000000000 即-2的15次方
建议你去看下二进制数原码 补码 反码的知识
育知同创教育
2016-04-24 · 百度知道合伙人官方认证企业
育知同创教育
1【专注:Python+人工智能|Java大数据|HTML5培训】 2【免费提供名师直播课堂、公开课及视频教程】 3【地址:北京市昌平区三旗百汇物美大卖场2层,微信公众号:yuzhitc】
向TA提问
展开全部
因为中间有0在,所以整数范围内要减1。
比如2的0次方就等于1,本来从1开始就是2的,结果就要减1了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
阳光的雷咩咩
2016-04-24 · TA获得超过1.4万个赞
知道大有可为答主
回答量:2.3万
采纳率:66%
帮助的人:7617万
展开全部
这就像十进制里,1位数最多只能表示9,2位数最多表示99,一样的道理。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
坤坤吃饭第一名
推荐于2018-04-09 · TA获得超过667个赞
知道小有建树答主
回答量:391
采纳率:66%
帮助的人:202万
展开全部

根据你的提问,你说的int是占2个字节。

首先,C语言中的int默认是有符号的,也就是可以存储正数,负数,0。除非你使用unisgend 修饰,例如 unsigend int 就只能存储非负数。

另外还要明确的是:目前使用的计算机系统几乎都使用补码编码方式存储有符号类型的整数

1、补码编码中,使用最高位来表示符号:1代表负数,0代表非负数。

2、二进制补码转换位等价10进制的方法:这个和一般二进制转10进制方法差不多,只不过有一点需要注意——符号位(最高位)是1的时候,其权重是负的,举例:

[1 000  0000    0000 0011]   =  1x(2^0) + 1x(2^1) +  0 + 0 +... +  (1*2^15)  = 3 - 32768 = -32765

所以根据这个二进制补码转10进制的公式我们可以发现:

一、最小的负数应该具有这样的模式 [1   0...0],即符号位是1,其余位都是0。假设我们用S_n_min表示它(S代表有符号整数,n代表占n位,min代表最小的),那么S_n_min = -(2^(n-1))。

二、最大的数应该具有这样的模式[0  1...1],即符号位是0,其余位都是1。假设我们用S_n_max表示它(S代表有符号,n代表占n位,max代表最大的),那么S_n_max = 1 + 2 +4 +8 + ... +2^(n-1),利用高中学的等比数列前n项和公式可以得到S_n_max  = 2^(n-1) -1。

总之,你要记住:

1、目前的计算机系统几乎都使用补码编码方式存储有符号类型的整数。强烈建议你好好理解一下补码编码方式,具体参考《深入理解计算机操作系统》第2章。

2、对于一个采用补码编码,占n位的有符号整数类型,其范围是 - 2^(n-1)  ~ 2^(n-1) -1,最小值的绝对值总比最大值的绝对值大1,并不是对称的。这个规律强烈建议你背下来!

经过上面的推导,我们得到了一些通用的规律,而不限于int,short或者long。只要它是整数,采用补码编码,且占用n位,那么我们就可以套用公式得到它的范围。例如你说int,占用16位,n=16,那么最小值 S_16_min = -32768,最大值S_16_max = 32767。

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
辛运者110
2016-04-24 · 超过15用户采纳过TA的回答
知道答主
回答量:350
采纳率:0%
帮助的人:57.7万
展开全部
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式