c语言中int取值范围-2的15次方至2的15次方减1,为什么要减1 100
2016-04-24 · 百度知道合伙人官方认证企业
比如2的0次方就等于1,本来从1开始就是2的,结果就要减1了
根据你的提问,你说的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。