又是一篇炒现饭的帖子,主要是经常忘记,记在这里
首先理解位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