首页 > 代码库 > 负数的二进制表示法

负数的二进制表示法

负数的二进制表示法

 

先了解几个概念

 

【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

负数的二进制表示法