原码,反码,补码备忘

又是一篇炒现饭的帖子,主要是经常忘记,记在这里

首先理解位bit(Binary digit http://en.wikipedia.org/wiki/Bit)

以下都以二进制为例

比如一个8位的存储单元,那么它就可以保存256种不同状态,如果是无符号数的话,那么就是0 ~ 2^8-1,即00000000 ~ 11111111

那么对于有符号的数就是-2^7 ~ 2^7-1,最高位拿来存储符号了,0为正,1为负,即10000001 ~ 01111111

十进制 原码 反码 补码
127 01111111 01111111 01111111
-127 11111111 10000000 10000001
128 010000000 010000000 010000000
-128 10000000
45 00101101 00101101 00101101
-45 10101101 11010010 11010011
1 00000001 00000001 00000001
-1 10000001 11111110 11111111

上表中红色的数是表示溢出的,8位的存储空间无法表示这样的有符号数

计算机中的有符号数都是以补码的形式存放的,可以理解为只有有符号数才有原码,反码,补码
正数的原码,反码,补码表示都一样
负数的原码为其绝对值的原码,但符号位为1;反码就是保持原码的符号位不变,其他位按位取反;补码就是反码加1

引用Wikipedia
“一个数字的二补数就是将该数字作位反相运算(即一补数),再将结果加 1,即为该数字的二补数。”

为什么要引入原码,反码,补码这些概念
参见:http://dev.csdn.net/htmls/17/17680.html

我们最需要关注的是补码,引用作者的原话是

补码的设计目的是:
⑴使符号位能与有效值部分一起参加运算,从而简化运算规则
⑵使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计

引用自http://zh.wikipedia.org/wiki/二補數
在二补数系统中,一个负数就是用其对应正数的二补数来表示。
00000100 4
11111011 按位取反
11111100 二补数(-4)

减法可以用一个数加上另一个数的二补数来表示
5
-4
———-
1

00000101
+11111100
———-
000000001

另外字节(Byte),字(Word),双字,四字,字长这些概念都需要理解

阮一峰有个帖子讲的也很清楚明了

参考

http://zh.wikipedia.org/wiki/原码
http://zh.wikipedia.org/wiki/反码
http://zh.wikipedia.org/wiki/二補數
http://en.wikipedia.org/wiki/One’s_complement
http://en.wikipedia.org/wiki/Two’s_complement

Leave a Reply

Your email address will not be published. Required fields are marked *