序言:一直以来,原码、反码、补码在脑海里就是困惑-模糊-清晰-模糊-清晰-模糊···的过程,我们写过的程序底层一直在用,可是一直没有零距离接触。
-
原码:就是加了一个符号为二进制数,八进制、十进制、或者16进制转换成二进制得到的数。对于n位的二进制数,理论可以表示2的n次方个状态(对应2的n次方个数值),但是其实有符号数0有两种表示法-0(10000000(以8位来举例))和+0(00000000),所以对于n位的二进制数,实际可以表示2的n次方-1个状态。有符号数表示范围为(-2的n次方+1~2n次方-1),无符号数表示范围为(0-2的(n+1)次方-1);
-
反码:英语里又叫ones' complement(对1求补),这里的1,本质上是一个有限位计数系统里所能表示出的最大值(111111111(以8位来举例))。求反,就是用最大数减去一个数就能得到它的反,即把这个数按位取反,0变1,1变零,所以才称之为反码。用原码求反码的方法是,正数不变,负数保留符号位1不变,剩下位按位取反。
-
补码: 英语里又叫two's complement(对2求补),这个2指的是计数系统的容量(模),就是计数系统所能表示的状态数。用模减去一个数(有符号数,不包含符号位)就能得到这个数的补。因为模数是在最大数(有符号数,不包含符号位)的基础上加1,所以又可以表述为先求反(这个在反码中已经说明了)再加1。总结求补码的方法就是正数依旧不变,负数保留符号位不变,先求反码再加上1。
网友评论