有符号整形采用二进制补码表示方式。在补码表示中,符号位为最高位,0表示正数,1表示负数。负数的补码是其绝对值的二进制表示取反后加1。
以16位补码为例,最小的负数是1000 0000 0000 0000,这是最高位为1,其余位均为0的二进制数,对应于十进制数-32768。
在有符号整形采用原码表示方式的情况下,最小的负数是1000 0000 0000 0000。在加1时就会溢出,得到的结果是1000 0000 0000 0000,这个数字的绝对值大于32767,超出了有符号整形的表示范围。
因此,为了解决这个溢出问题,有符号整形采用了补码表示方法,最小的负数变成了1000 0000 0000 0000,没有溢出问题。
在有符号整形采用补码表示方式下,对于16位整数,取值范围为-32768至32767。而如果取值范围为-32767至32767,则会出现一个问题:0没有对应的表示。因为0的补码是0000 0000 0000 0000,而当用原码表示时,就是+0,与-0无区别,整型的取值就无法区分正零和负零,这对某些应用有影响。
最终,为什么选择-32768而不是其他的值呢?事实上,历史原因也是在某种程度上起了一定的作用。
在计算机发展的早期,常用的字长是8位或16位,当时采用的大都是符号位为最高位的原码表示,后来发现其存在各种问题。当采用补码表示时,对于16位整数,取值范围为-32768至32767,所以沿用至今。