【二进制补码可以用来表示小数吗?】
可以,不过需要你自己来处理。方法是,按照所需要的精度,将该小数放大若干倍,当整数处理。
为方便通常放大2的若干次方倍。
这样,你就可以把这个整数看成“定点小数”,即保留了若干位二进制小数的定点数。
有些资料上,将这种格式称作Q格式。如“Q8格式”就是保留了8位小数位的定点数。
这种定点小数,做加减法时,需要小数点对齐,必要时需先做移位操作。
乘除法时,也要掌握小数点位置。例如“Q8格式”和“Q4格式”的数相乘,其积应该看做“Q12格式”的。
需注意C语言中的移位操作中,其“右移”分为“算术右移”和“逻辑右移”两种。对于“有符号”数,实行的是“算术右移”,对于“无符号数”,实行的是“逻辑右移”。
如果您的程序中定义变量类型时定义的正确,那么你这些右移操作就不会错误。
如果您的程序中有“无符号”和“有符号”混用的地方,或强制类型转换的地方,需要注意这点不要出错。
“算术右移”和“逻辑右移”的区别:
“逻辑右移”时最高位一律补零。
“算术右移”时最高位保持不变,即:负数补1,正数补零。
例如,用Q4的格式来表示0.75,放大2的4次方倍,为12,
机器码是0000000000001100
可以看做是定点小数000000000000.1100
另,用Q4的格式来表示-0.75,放大2的4次方倍,为-12,
机器码是1111111111110100
可以看做是定点小数111111111111.0100
如上,按Q4格式,用12代表0.75,用-12代表-0.75。
要做(0.75)×(-0.75)用(12)×(-12)代表,乘得(-144)。
-144的机器码是1111111101110000
看做Q8格式的定点小数11111111.01110000
可以代表-0.5625。(等于-144/256,即-9/16)
假如下面又要做别的运算,需要把这个Q8的定点小数化为Q4格式,那么,可以用>>4的运算,把这个数“算术右移”4位,得111111111111.0111。(这个数,如果当普通整数看,就是-9。)
请注意这里右移的时候最高位补了4个1。
【给我一段二进制补码,我怎么将其还原成十进制的数值?】
首先,要知道其字长。以16位字长为例:
16位字长如果是无符号数,可以表达的十进制数的范围是0 ~65535;
如果是有符号数,可以表达的十进制数范围是-32768 ~ +32767。
这里65536是2的16次方,32768是2的15次方。
正整数的二进制化十进制想您应该知道吧?例如10010000化为十进制就是
((((((1×2+0)×2+0)×2+1)×2+0)×2+0)×2+0)×2+0 = 144
给你一个有符号数的补码表示法的16位二进制代码,暂时先按照上述无符号数(即正整数)的规则,化为十进制;
然后,看其符号位(最高二进制位)是否是1:
如果是0,就表示它是正数。结果就对了。
如果是1,就表示它应是负数,将此暂时值再减去65536,所得结果(负数)就是应有的结果了。
上述“看其符号位是否是1”的判断,也可以代之以“看暂时值是否不小于32768”。
例如:1111111111110111按照上述规则,得暂时值为65527。
因为符号位是1,说明它应该是负数:65527 - 65536 = -9。
二进制表示小数:
把十进制小数逐次乘2取整,直到小数位为0(有些小数不能成为纯整数,就要取若干精度位数)
比如:0.125变成二进制为001
步骤:1、0.125*2=0.25 取整数位0
2、0.25*2=0.5 取整数位0
3、0.5*2=1.0 取整数位1
4、小数位已经为0,所以结果为001
二进制补码变十进制数:
先把补码变成原码,再把原码变成十进制数。(正数补码和原码一样,将负数补码的数字位取反再加1就变成原码了)
比如:补码为01101100,原码和补码一样01101100(第一位为0,所以是正数)
补码为11101100,原码为10010100(第一个数是1,所以是负数)
原码变十进制数你应该会吧
可以
举例:二进制补码 1100111 0011001
二进制原码 0011000 1100110
十进制 2^4+2^3=24 2^6+2^5+ 2^2+2^1=102
好像是这样吧,我也是初学者。。。。
原码反码补码中,就只有 1 和 0,并没有小数点。
小数点在何处? 你需要事先约定。
实际上,小数的运算,是用“浮点数”完成的。
讨论“小数的原码反码补码”,并没有任何意义。