计算机中把最高为定义为符号位:
用“0”表示正,用“1”表示负。
正数的补码:是正数本身。
负数的补码:去掉符号后,先按位取反,再加一。
例一、short num = -1;
可知short占2个byte,2个byte为16位。
-1的原码:
1000 0000 0000 0000 0001
提示:
因为-1是负数,所以最高位符号位是1.
-2的反码:(即按位取反)
1111 1111 1111 1111 1110
-2的补码:
1111 1111 1111 1111 1111
= 2^16 -1 = 65535 = 0xFF
重点:16位数字最大表示为:65535
例二、int count = -1
可知int占4个byte,8位为一个byte,共32位。
-1的原码:
1000 0000 0000 0000 0000 0000 0000 0001
-1的反码:
1111 1111 1111 1111 1111 1111 1111 1110
-1的补码:
1111 1111 1111 1111 1111 1111 1111 1111
= 2^32 -1 = 4294967295 = 0xFFFFFFFF
重点:32位数字最大表示为:4294967295
例三、long ss = -1;
可知long占8个byte,一个byte8位,一个long占64位。
-1的原码:
1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001
-1的反码:
1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 11111 1111 1111 1111 1111 1110
-1的补码:
1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 11111 1111 1111 1111 1111 1111
= 2^64 -1 = 18446744073709551615 = 0xFFFFFFFFFFFFFFFF
重点:64位数字最大表示为:18446744073709551615
例四、正数和负数相加运算。
short a = 2;
short b = -1;
a + b = 2 + (1) ?
1.使用原码运算(得到错误结果)
a = 0000 0000 0000 0010
+
b = 1000 0000 0000 0001
= 1000 0000 0000 0011
如果是有符号,最高为符号位是1表示负数,结果为:3;
如果是无符号,结果为:32771
总结:这种算法,计算机得不到正确的结果,也是负数用补码表示的原因。
2.使用补码二进制运算(得到正确结果)
a = 0000 0000 0000 0010
+
b = 1111 1111 1111 1111
= 0000 0000 0000 0001
= 1
最高位为0,表示正数。