有时候在编程的时候,跟踪代码查错,明明传过来的-1,但结果显示的是
0xFFFF;其实这就是-1的补码。了解原码,反码,补码对自己编程还是有一定
帮助的,之前也只是模糊的了解一点,最近查了一些资料,记录下来,以免自己
忘记
原码:因为我们看到的十进制数,存入计算机的时候,都会转化成二进制,
计算机只认识二进制码。比如:“3” -> 0x0000 0011;
反码:原码为正数时,和原码一样。负数时,除了第一位符号位,其余位置取反
,
补码:原码为正数时,和原码一样。负数时,等于反码+1,
公式:
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
为什么要反码和补码呢?原码不就可以了解决问题了吗?
比如:1 - 1 = 0;
1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2
为什么变成1 + (-1)呢? 因为计算机很笨,只认识+法,不认识减法;也不认识
乘除法,我们写程序能做加减乘除,都是转变成+来完成的。具体怎么转换,可以查
一些资料,主要是用到移位和各种操作符号的结合,最终转换为+运算。
回归主题,很明显-2不是我们要的结果,对吧。
用反码运算:
1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0
能得到我们要的结果,但是,结果为“-0”,0 是不分正负号的,这样做很明显
有会多占用一个位置;
用补码运算:
1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补=[0000 0000]原
这样的结果,就不会带符号了,符合我们的要求;
程序中使用二进制码,会提高我们的程序运行效率,以及减少空间。当然大多数
情况是体现不出这种效率的。但是了解之后用来调错还是不错的。
网上有很多利用原码,补码,反码,来解决日常经常碰到的一些问题:效率都非
常高,而且也比较简洁;
比如:交换2个数;
a^=b;
b^=a;
a^=b;
这样就实现了,a和b数字的交换。没有用到第三个变量,存数据。
网上还有很多类似的技巧,有时间可以在网上查一下,对提升自己写程序会有很
大帮助的;