先了解几个概念
【1】原码:
·正数的原码,按照绝对值转换成二进制
·负数的原码,按照绝对值转换成二进制,最高位补1(有符号的整形最高位用来表示正\负,0为正数,1为负)
示例:
整数5的原码
00000000 00000000 00000000 00000101
整数-5的原码
10000000 00000000 00000000 00000101
【2】反码:
·正数的反码,与原码相同
·负数的反码,符号位不变,其余为取反
示例:
整数5的原码与反码表示
原码:00000000 00000000 00000000 00000101
反码:00000000 00000000 00000000 00000101
整数-5的原码与反码表示
原码:10000000 00000000 00000000 00000101
反码:11111111 11111111 11111111 11111010
【3】补码
·正数的补码,与原码相同
·负数的补码,符号位不变,其余为取反,最低位+1
示例:
整数5的原码反码与补码表示
原码:00000000 00000000 00000000 00000101
反码:00000000 00000000 00000000 00000101
补码:00000000 00000000 00000000 00000101
整数-5的原码、反码与补码表示
原码:10000000 00000000 00000000 00000101
反码:11111111 11111111 11111111 11111010
补码:11111111 11111111 11111111 11111011
【4】特殊
为简单起见以长度为1byte的char举例
-128表示为
1000 0000,那么,它的原码是什么呢?从补码求原码的方法跟原码求补码是一样的。先保留符号位其它求反: 1111 1111, 再加1,11000 0000, 超过了8位了。对,用8位数的原码在这里已经无法表示了。
那么,回到原码处, 它的原码也是 1000 0000(超出的自动丢失),1000 0000 在原码表示什么呢? -0, 但补码却规定0没有正负之分。
转换一下思路,看看计算机里,是怎么运算的:
对于负数,先取绝对值,然后求反,加一
-128 -> 128 -> 1000 0000 -> 0111 1111 -> 1000 0000
现在明确了吧
所以, 8位有符号的整数取值范围的补码表示
1000 0000 到 0000 0000, 再到 0111 1111
即 -128 到 0, 再到 127
最终 -128 ~ +127
转自:http://blog.sina.com.cn/s/blog_56d8ea900100y65b.html