补码怎么算,原码反码补码怎么算


什么是补码 , 怎么计算 C语言中 , 所有的整型数据实际存储的都是补码 。
要计算补码 , 先要知道原码的概念 , 原码也就是一个10进制数的二进制表达方式 , 比如100的原码为1100100 。
补码的计算原则为:
1 对于无符号数以及有符号数中的正数 , 其补码就是原码本身;
2 对于有符号数中的负数 , 其补码为真值绝对值的反码加一 , 其中反码为原码按位取反 。
针对负数举例说明:
-100在用char型(8位)表示时 , 其补码可以按照如下流程计算 。
1、 100的原码为01100100
2、按位取反 , 得到反码为10011011
3、将反码加1 ,  即10011011+1 = 10011100 。
于是-100的补码表示就是10011100,也就是0x9C(16进制) 。
什么是补码 , 怎么计算? 怎么还能算出来个-8?
算法如下:

25 = 00011001
+(-32) = 11100000
----------------------------
-7 = 11111001
补码如何运算 两种计算方法:

算法1: 补码=原码取反再加1的逆运算
10010110是补码 , 应先减去1变为反码 , 得10010101;
由反码取得源码即除符号位外其他为按位取反 , 得11101010 , 即十进制数的-106

算法2:负数补码速算法 , 由最低位(右)向高位(左)查找到第一个1与符号位之间的所有数字按位取反的逆运算
10010110是补码 , 符号位与最后一个1之间的所有数字按位取反 , 得11101010

两种算法得出同样结果
如何求补码 求给定数值的补码表示分以下两种情况:
(1)正数的补码
与原码相同 。
【例1】+9的补码是00001001 。 (备注:这个+9的补码说的是用8位的2进制来表示补码的 , 补码表示方式很多 , 还有16位2进制补码表示形式 , 以及32位2进制补码表示形式等 。 )
(2)负数的补码
负数的补码是对其原码逐位取反 , 但符号位除外;然后整个数加1 。
同一个数字在不同的补码表示形式里头 , 是不同的 。 比方说-15的补码 , 在8位2进制里头是11110001 , 然而在16位2进制补码表示的情况下 , 就成了1111111111110001 。 在这篇补码概述里头涉及的补码转换默认了把一个数转换成8位2进制的补码形式 , 每一种补码表示形式都只能表示有限的数字 。
【例2】求-7的补码 。
因为给定数是负数 , 则符号位为“1” 。
后七位:-7的原码(10000111)→按位取反(11111000)(负数符号位不变)→加1(11111001)
所以-7的补码是11111001 。
已知一个数的补码 , 求原码的操作分两种情况:
(1)如果补码的符号位为“0” , 表示是一个正数 , 其原码就是补码 。
(2)如果补码的符号位为“1” , 表示是一个负数 , 那么求给定的这个补码的补码就是要求的原码 。
再举一个例子:求-64的补码
+64:01000000
11000000
【例3】已知一个补码为11111001 , 则原码是10000111(-7) 。
因为符号位为“1” , 表示是一个负数 , 所以该位不变 , 仍为“1” 。
其余七位1111001取反后为0000110;
再加1 , 所以是10000111 。
在“闲扯原码、反码、补码”文件中 , 没有提到一个很重要的概念“模” 。 我在这里稍微介绍一下“模”
的概念:
“模”是指一个计量系统的计数范围 。 如时钟等 。 计算机也可以看成一个计量机器 , 它也有一个计量范
围 , 即都存在一个“模” 。 例如:
时钟的计量范围是0~11 , 模=12 。

推荐阅读