1、补码
补码的存在是为了在计算机内部将减法变成加法;
正数的补码是原码本身,负数的补码是绝对值的反码加1,补码是用正数表示负数,负数的补码与绝对值原码相加等于0,因为:
对于8位二进制来说,反码与原码相加一定得:1111 1111,这是因为反码是将原码的每一位都取反了,相加的时候,每一位上都是1个1,一个0。而补码与原码相加,就是反码+1+原码,也就是:
1111 1111+0000 0001=1 0000 0000,溢出的一位忽略掉,最后得到:
0000 0000;
此时,5-5就可以表示为5+(-5),而-5就用补码表示;
当计算结果为负数时,得到的结果也是补码。
2、负数的二进制表示
负数的二进制用补码表示,补码是负数绝对值的反码加1,如-5的补码:
-5的绝对值是5,二进制为:0000 0101,则补码是:
1111 1010+0000 0001=1111 1011
若要根据补码算出十进制,则通过“反码加1”得到的是绝对值,如:
1111 1011是-5的补码,将其“反码加1”后得到:
0000 0100+0000 0001=0000 0101
是十进制的5,所以结果是-5;
3、short类型的取值范围
short类型是2字节的,取值范围是-32768~32767,最高位是符号位,之所以负数比正数多一个是因为:
当最高位为0时,表示正数,范围是:
0000 0000 0000 0000~0111 1111 1111 1111,即0~32767
当最高位为1时,表示负数,范围是:
1000 0000 0000 0000~1111 1111 1111 1111,全部是补码形式,其中,1000 0000 0000 0000的补码是:
0111 1111 1111 1111+1=1000 0000 0000 0000,表示为十进制是32768,又因为是负数,所以结果是-32768;
而1111 1111 1111 1111的补码是:
0000 0000 0000 0000+1=0000 0000 0000 0001,表示为十进制是1,所以结果为-1,所以范围是-1~-32768;
正数和负数范围内都是32768个数,只是0算在正数里了,所以看上去正数比负数少了1;