一摸鱼就是好久,主要最近学校期末了,开始各种交大作业,真的伤脑筋
这次就来哔哔一下原码 反码 补码这三兄弟吧
此时先定义一个数
int i = 1;
由于实在懒,就不取那么大的数了,1多好,简简单单
原码指的是一个数的二进制表示,那么1就是
00000000 00000000 00000000 00000001
但是,正数的原码 反码 补码都是一样的,所以。。。例子失败了
那就换个例子吧
如果此时给出一串二进制
11111111 11111111 11111111 11111110
这个数代表的是多少?
刚看到的人可能一看,哇,这么多的1,得算到啥时候去,其实不然
首先我们需要看的是第一位,也就是这个
11111111 11111111 11111111 11111110
在二进制中第一位如果是1就代表着是负数,如果是0就代表着正数,不会有人连这个都不知道吧,那你现在就知道咯
所以这个数其实是个负数,而在进行存储时,负数存储的其实是补码,所以为了知道这串二进制代表的真正是数字是多少,我们还需要把他变成原码才行,也就是说
11111111 11111111 11111111 11111110
是这个数的补码
那么怎么换成原码呢,这里讲一讲原码变成补码的步骤
首先原码要求反变成反码,随后由反码 +1 变成补码
感觉有点麻烦的亚子,可是为了c语言设计的方便,就把他设计成了只能进行加运算,负数也只能这么麻烦了,从某些意义上来讲还引起了不错的重视咧
但是这里要求的是原码,害,数学逆运算嘛
我们这串二进制是
11111111 11111111 11111111 11111110
那首先我们需要把他变成反码,反码变成补码是要 +1
那我们就 -1
11111111 11111111 11111111 11111110
-1
11111111 11111111 11111111 11111101
很简单的计算嘛,就是向前借一位,而二进制中前一位的 1 代表着 2 ,所以减完 1 前一位就是 0 ,后一位就是 1 了,逻辑想通了就特别简单,所以
11111111 11111111 11111111 11111101
就是这个数的反码
接下来再给这段二进制求反,你先求反得到了这个,那这个再求反就变回原来的亚子,没毛病吧
11111111 11111111 11111111 11111101
求反
10000000 00000000 00000000 00000010
注意哦,第一位可不能变的,那是代表着符号的位,不然一个负数就变成正数了
那此时再来看这个数,会发现这个数竟然只是一个小小的 -2 ,但是存储的时候存了个补码老多 1 了,即
10000000 00000000 00000000 00000010
是这个数的原码
总结一下
原码 (取反)→反码
反码(+1)→补码
负数在进行存储时存的是补码
正数的原码反码补码都是一样的
判断正负的时候需要看他二进制的第一位,是0就是正数,是1就是负数
在进行原码反码补码之间变化取反时第一位的数字是不变的(但是需要注意的是如果直接对数字取反如: ~-2 时符号位需要变化)