一个字节8位,如果是原码方式表示正整数包含0,是0-255范围,2^8共256个,从0000 0000 到1111 1111的各种排列组合。
如果表示负数,符号位(最高位需要占1位)1表示负数,0表示整数,绝对值范围是0-127,2^7=128;一共正负各128个;
但是这种情况下0占用了2个编码(1000 0000和 0000 0000),数据表示范围-127~-0和 +0~+127
这样总共有256个;实际0占用了正0和负0;这种0占用正0和负0情况,人们想到了另一种编码把负0利用起来,当遇到负数时,采用补码来表示就可以解决这个问题,如果是正数或0时还是保留原码表示(补码的正数还是自己本身);
因此这个负0通过补码算法处理后自然被利用起来了,用来表示-128
补码的算法为:绝对值的原码各位取反后加1
例如 负1的补码
绝对值原码8位原码 0000 0001
反码各个位取反 11111 1110
补码 1111 1111
此时最高位被处理为1,满足高位为1代表负数的定义
例如 负128的补码
绝对值的8位原码 1000 0000
反码 0111 1111
补码 1000 0000
此时最高位置为1,满足最高位为1代表负数的定义,同时原先表示负0的编码也被利用起来
表示-128
因此一个字节的有符号整数范围-128到127