c语言,为什么正数数值范围都是2的多少次方减1

如题所述

这得从二进制的原码说起:
如果以最高位为符号位,二进制原码最大为0111111111111111=2的15次方减1=32767
最小为1111111111111111=-2的15次方减1=-32767
此时0有两种表示方法,即正0和负0:0000000000000000=1000000000000000=0
所以,二进制原码表示时,范围是-32767~-0和0~32767,因为有两个零的存在,所以不同的数值个数一共只有2的16次方减1个,比16位二进制能够提供的2的16次方个编码少1个。
但是计算机中采用二进制补码存储数据,即正数编码不变,从0000000000000000到0111111111111111依旧表示0到32767,而负数需要把除符号位以后的部分取反加1,即-32767的补码为1000000000000001。
到此,再来看原码的正0和负0:0000000000000000和1000000000000000,补码表示中,前者的补码还是0000000000000000,后者经过非符号位取反加1后,同样变成了0000000000000000,也就是正0和负0在补码系统中的编码是一样的。但是,我们知道,16位二进制数可以表示2的16次方个编码,而在补码中零的编码只有一个,也就是补码中会比原码多一个编码出来,这个编码就是1000000000000000,因为任何一个原码都不可能在转成补码时变成1000000000000000。所以,人为规定1000000000000000这个补码编码为-32768。
所以,补码系统中,范围是-23768~32767。
因此,实际上,二进制的最小数确实是1111111111111111,只是二进制补码的最小值才是1000000000000000,而补码的1111111111111111是二进制值的-1。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-01-30
因为整数在计算机中都是以对应二进制的补码(正数的补码就是对应的二进制码,负数的补码等于对应的二进制码按位取反再加一)存储的,由补码规则可知,同一个补码显然可能表示一个正数也可能表示一个负数,为了避免这种歧义的存在,又规定补码的最高位为符号位,这样一来一个补码就对应着了唯一个整数啦(注意这里可能有+0与-0,但都表示0)。
所以:正数的补码表示范围总是可表示为:000...001~011...111。从这里可以清楚的看出,不考虑符号位时,正数的范围为:1~11...111,又由于:11...111=(2^n)-1,所以:
正数数值范围总是可以表示成:(2^n)-1
第2个回答  2020-01-28
这样来说
就拿
4位打比方
位数少
好打比喻..
(我只是解释问题,并不代表程序中就是这样表示)
0000=0
1111=15
表示
2的4次方个数
也就是16个
由于有个0
数值就表现为
0-15
最大的数也就是2的4次方减1
各位别说那么专业..
我看楼主搞不明白
..
才这样解释的
往专业的说就是
1位
可以表示两种状态..
4位
就表示16种状态..
程序中
无符号数
就是0-15了
不可能再有别的
有符号
也是表示
16种状态
第一位符号位..
正1
负0(打比方)
其他三位就是有效数字了..
牵扯到
补码问题..
说太多
怕楼主迷糊..
按我的记就行了
第3个回答  2020-01-30
计算机是用2进制的。显示正数,最大的当然是每个位都为1.假设可以显示N位,将111....1转变为十进制也就是=2的零次方+2的一次方+...+2的(n-1)次方,用数列公式算出来就是(2的n次方-1)
第4个回答  2020-03-21
因为不减那个1就溢出了,八位二进制数最大的就是11111111,就是2^8-1,如果是2^8的话就是100000000,就不是八位二进制数而是九位了
相似回答