首先我们知道求一个有符号十进制数的补码有很多种方法。
正十进制数的补码与我们的原码和反码的值相同。
负十进制数的补码:
法一:
(负数的)反码+1;
负数的反码:即符号位为1,数值位为原码数值位取反(0 -> 1,1 -> 0)
法二:
将正数的原码,从右往左看,遇到的第一个1,与它右边的数保持不变,左边的数按位取反。
例如: +75(10)=0 1 0 0 1 0 1 1
-75(10)=1 0 1 1 0 1 0 1
法三:
-128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | |
+86(10) | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 |
-86(10) | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 |
-86(10)=-128+32+8+2
注意这里我们将最高位128进行取负计算。
我们接下来也会根据法三来进行补码转化为有符号十进制数的操作
例:
unsigned
char
binaryInteger [] = {1 ,0 ,1 ,1 ,1 ,1 ,0 ,1};
1.将二进制整数转换为无符号十进制整数;
2.使用补码将二进制整数转换为有符号十进制整
#include<>
#include<>
int main(){
unsigned char binaryInteger [] = {1 ,0 ,1 ,1 ,1 ,1 ,0 ,1};
int s,i,j;
int length= sizeof(binaryInteger)/sizeof(unsigned char);
for( i = length-1,j=0 ; i >= 0; i--,j++){
s = s + binaryInteger [i]* pow(2,j);
}
printf("无符号十进制整数为%d",s);//189
//有符号的二进制补码转化为十进制
if(binaryInteger [0]==1){//符号位为1
s=0;
for(i=length-1,j=0;i>0;i--,j++){
s+=binaryInteger [i]* pow(2,j);
}
s=s-binaryInteger [0]*pow(2,length-1);//符号位计算时取负值
}else{
//符号位为0
s=0;
for( i = length-1,j=0 ; i >= 0; i--,j++){
s = s + binaryInteger [i]* pow(2,j);
}
}
printf("有符号十进制为%d",s);//-67
}
注:如果这里是用户输入,只需要定义一个数组,用for循环配合scanf'往里面填充数值就可以了。