关于C语言中有符号的整数值范围为什么是从-32768~32767

来源:百度知道 编辑:UC知道 时间:2024/06/13 03:17:25
尽量讲得详细些!例如16个1111111111111111头位是符号位,这应是-32767,那-32768怎么 用16位二进制来表示?
负数的二进制表示怎么算的?
例如:
-1 的二进制
-32767 的二进制

这是一种过时的说法了,只有在比较古老的书上才可以看到。

对于有符号整型,也就是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次幂。

-2^15~(2^15-1)
计算机中数字是以补码存储的
主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补
码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。

在C中,用高位置1来表示负数,int型占两个字节共16位,32768的二进制是10000000,00000000,高位为1,系统会认为是负数,所以32768需要用长型表示,占四个字节。最高位就不是1了。(00000000,00000000,10000000,00000000)
-32768在内存中的表示是10000000,00000000。过程是:先读入正值3