C语言,二进制数转化为无符号十进制数,补码转化为有符号十进制数---全网最易懂,最简单的方法

时间:2025-02-14 13:45:12

 首先我们知道求一个有符号十进制数的补码有很多种方法。

正十进制数的补码与我们的原码和反码的值相同。

负十进制数的补码:

法一:

(负数的)反码+1;

负数的反码:即符号位为1,数值位为原码数值位取反(0 -> 1,1 -> 0)

法二:

将正数的原码,从右往左看,遇到的第一个1,与它右边的数保持不变,左边的数按位取反。

例如:        +75(10)=0 1 0 0 1 0 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'往里面填充数值就可以了。