关于C语言中有符号的整数值范围为什么是从-32768~32767,例如16个1111111111111111头位是符号位,这应是-32767,那-32768怎么 用16位二进制来表示?

对于有符号整型,也就是int型,是和编译器的字长有关的,只有在16位编译器上,int类型占2个字节,其表示范围才是-32768~32767;
对于32位和64位编译器,int类型占4字节,表示范围为-2147483648~2147483647。

以16位编译器为例,介绍其原理,对于32位和64位类似。
int为有符号整型数,在16位编译器上占2字节16位。
对于有符号数,计算机中表达时,最高位约定为符号位,当符号位为0时为正数,符号位为1时为负数。
所以真正表达值的部分是剩余的15位,这15位的范围就是二进制的000 0000 0000 0000到111 1111 1111 1111。
转换成十进制也就是0~32767。
所以,正数的表示范围就是1~32767.
其中有一个特殊的值,就是0值,对于符号位1和0的时候,值都是0,用两个形式表示同一个数无疑是浪费的,符号位为1时的全0,就用来表达-32768了,这也是负数表示的范围比正数多1的原因。

综上,对于任意位的,无论是8位,16位,32位甚至64位的整数类型表示范围的计算公式为:
如总位数为n位,那么有符号数的范围为
-2^(n-1) ~ 2^(n-1)-1
无符号数的表示范围为:
0~2^n-1
在这个公式中,^表示乘方。2^n就是2的n次幂。
posted @ 2017-10-31 11:22  Allen101  阅读(1488)  评论(0)    收藏  举报