我学c语言时,刚遇到原码,反码,补码,那可搞的我花了不少时间才弄懂,我为了让更少人走弯路,
讲讲我的理解吧。
1.要知道原码:原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值比如:如果是8位二进制:+1原码= 0000 0001 正数的符号位是0
-1原码= 1000 0001 负数的符号位是1
2.要知道十进制转化位二进制的方法
整数除二取余,先得到的余数从低位排起,直到商为0.小数乘二取整,也是从低位排起。
如2的原码= 0000 0010
0.2原码= 0.001(看要求取多少位)
3.要知道为什么不能只用原码不用反码或补码呢?
为了解决原码做减法的问题, 出现了反码如计算十进制的表达式: 1 - 1 = 0
1 - 1 = 1 + (-1) = [0000 0001]原+ [1000 0001]原= [1000 0010]原= -2
显然不正确
同样为了解决1 - 1 = 1 + (-1) = [0000 0001]原+ [1000 0001]原= [0000 0001]反+ [1111 1110]反= [1111 1111]反= [1000 0000]原= -0 ,虽然人们理解上+0和-0是一样的,但是0带符号是没有任何意义的,而且会有[0000 0000]原和[1000 0000]原两个编码表示0所以出现了补码。
4.要知道它们的关系
原码--- 反码 --- 补码
//按位取反 +1
//补码--- 反码 --- 原码
// —1 按位取反
5.要知道计算机的原理
//负数在内存中存储时,存储的是二进制的补码
int main()
{
int b = ~a;
printf("%d\n", b);
return 0;
}
//00000000000000000000000000000000 0的二进制序列
//11111111111111111111111111111111 ~a意思是按位取反
//11111111111111111111111111111110
//10000000000000000000000000000001
//最终把它化为原码
//—1为这个代码的输出结果