原码、反码、补码的第一位都是是符号位,0为正数,1为负数,不论小数整数都是如此。

eg:0.2(2)是个负数,1.2(2)是个正数,11112(2)是个负数,01112(2)是个正数。

十进制->二进制原码

二进制原码就是单纯求模运算得到的。

这个转换规则小数和整数区别较大,正数向负数转化很简单。

正整数:除2取余,直到商为零,余数倒叙排列

eg:8(10)=0100(2)当然,如果是一个8位机的话,一个数字由8个二进制位组成,所以应该是8(10)=0000

0100(2)

注意:对于一个8位机来讲,原码能表示的整数范围是-128~+127,和256没关系。

正小数:整数部分按上面说的办,这里只说小数部分该如何处理。

乘2取整法,即将小数部分乘以2,然后取整数部分,剩下的小数部分继续乘以2,然后取整数部分,剩下的小数部分又乘以2,一直取到小数部分为零为止。如果永远不能为零,就同十进制数的四舍五入一样,按照要求保留多少位小数时,就根据后面一位是0还是1,取舍,如果是零,舍掉,如果是1,向入一位。换句话说就是0舍1入。读数要从前面的整数读到后面的整数。

eg:将0.125(10)换算为二进制

0.125*2=0.250    小数点前为0,答案第一位为0

0.250*2=0.5小数点前为0,答案第二位为0

0.5*2=1小数点前为1,答案第三位为1

所以0.125(10)=0.001(2)

负数:先求出其绝对值的二进制原码,然后将第一位(也就是符号位上的0)强行改为1就可以了。

eg:-0.5(10)=1.1(2)      -1.5(10)=11.1(2)

-8(10)=1100(2)  同样,如果是一个8位机的话,应该是-8(10)=1000  0100(2)

二进制原码->二进制反码

这个转换小数和整数一样,但是正数和负数不一样。

对于正数,反码就是其原码本身。对于负数,反码是其原码符号位不变(还是1),其余各位直接取反。

eg:

[+1] = [00000001]原 = [00000001]反

[-1] = [10000001]原 = [11111110]反

二进制原码->二进制补码

正数的补码和源码相同,负数的补码=反码+1。整数小数用同一套规则。

[-y]补=-[y]补+2^-n   即:对[y]补包括符号位求反最末位加1