原码、反码、补码的第一位都是是符号位,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