四位二进制数 | 十进制(反码) | 十进制(补码) |
---|---|---|
0000 | 0 | 0 |
0001 | 1 | 1 |
0010 | 2 | 2 |
0011 | 3 | 3 |
0100 | 4 | 4 |
0101 | 5 | 5 |
0110 | 6 | 6 |
0111 | 7 | 7 |
1000 | -7 | -8 |
1001 | -6 | -7 |
1010 | -5 | -6 |
1011 | -4 | -5 |
1100 | -3 | -4 |
1101 | -2 | -3 |
1110 | -1 | -2 |
1111 | 0 | -1 |
大部分计算机使用的都是补码(two complement)体系,这种体系中最高位即符号位产生的进位会被丢弃,如1100(-4)+1111(-1)=1011(-5);这种算法 取反后加1 相当于对十进制数取相反数,取反相当于去相反数减1,即~x=-x-1。
而IP数据报与UDP数据报检验和的算法采用反码体系(one complement),这种体系中最高位产生的进位会加给最低位,如1110(-1)+1001(-6)=0111+0001=1000(-7)。用这种算法 取反 相当于对十进制取相反数。检验和算法实际为x+(~x)=x+(-x)=0(反码全为1)取反后全为0。