用途:计算机里面的数据是用补码储存的,此代码适用于32位的16进制有符号数计算,如0x12345678+0x0

直接输入要运算的16进制有符号(0x等前缀,随便你带不带)。若要增加功能,自己修改主函数就行,代码思路,在最下面。

如图:

代码:

#include<iostream>
#include<string.h> 
#include<algorithm>
#include<math.h>
#define max_hex 8
using namespace std;
long long int fun_16_10(string B)
{
	string A=B;
	string::iterator  it;
    for (it =A.begin(); it != A.end(); it++)//删除0 x X 
    {
       if ( (*it != '0')&& (*it != 'x')&& (*it != 'X')){
       		break;
	   } 
	   A.erase(it); 
	   it--;//删掉了一个所以要指针前移一位 
    }
    string binar2="" ;
    for(int i=0;i<A.length();i++)//转化为二进制(补码) 
	{
		if(A[i]=='0') binar2+="0000";
		else if(A[i]=='1') binar2+="0001";
		else if(A[i]=='2') binar2+="0010";
		else if(A[i]=='3') binar2+="0011";
		else if(A[i]=='4') binar2+="0100";
		else if(A[i]=='5') binar2+="0101";
		else if(A[i]=='6') binar2+="0110";
		else if(A[i]=='7') binar2+="0111";
		else if(A[i]=='8') binar2+="1000";
		else if(A[i]=='9') binar2+="1001";
		else if(A[i]=='a'||A[i]=='A') binar2+="1010";
		else if(A[i]=='b'||A[i]=='B') binar2+="1011";
		else if(A[i]=='c'||A[i]=='C') binar2+="1100";
		else if(A[i]=='d'||A[i]=='D') binar2+="1101";
		else if(A[i]=='e'||A[i]=='E') binar2+="1110";
		else if(A[i]=='f'||A[i]=='F') binar2+="1111";
		else cout<<"输入错误"<<endl; 
		
	}
//	cout<<"补码:"<<binar2<<endl;
	int len_bi2=binar2.length();//长度 
	long long int sum=0;//储存和 
	int x=0;
	
	if(A.length()==max_hex&&binar2[0]=='1') {//负数 
	
		for(int i=1;i<len_bi2;i++){
			if(binar2[i]=='1') binar2[i]='0';
			else binar2[i]='1';
		}
		
		
		for(int i=len_bi2-1;i>0;i--)
		{
			sum+=(binar2[i]-'0')*pow(2,x);
			x++;
		}
		sum=-(sum+1);//之前差的1,补上
		
		return sum;
	}
	x=0;
	sum=0;
	for(int i=len_bi2-1;i>=0;i--)
	{
//		cout<<"bin2:"<<binar2[i]<<endl;
//		cout<<"和:"<<(binar2[i]-'0')*pow(2,x)<<endl;
		sum+=(binar2[i]-'0')*pow(2,x);
		x++;
	}
	return sum;
}
int main() 
{
//	string A;
//	cout<<"请输入16进制数,最大8位,可带0x,可不带"<<endl; 
//	while(cin>>A){
//		cout<<"结果:"<<fun_16_10(A);
//	}
	string A,B;
	while(cin>>A>>B){
	
	long long int a1,b1;
	a1=fun_16_10(A);
	b1=fun_16_10(B);
	
	cout<<"十进制A:"<<a1<<endl; 
	cout<<"十进制A+B:"<<a1+b1<<endl;
	cout<<"十进制A-B:"<<"A-B=:"<<a1-b1<<endl;
	cout<<"十进制A*B:"<<"A*B=:"<<a1*b1<<endl;
	cout<<endl;
    //16进制输出
	cout<<"十六进制A+B:"<<hex<<"A+B=:"<<a1+b1<<endl;
	cout<<"十六进制A-B:"<<hex<<"A-B=:"<<a1-b1<<endl;
	cout<<"十六进制A*B:"<<hex<<"A*B=:"<<a1*b1<<endl;
	cout<<endl;
	}
	
}	

如以下题目:

将两个16进制补码数相乘,然后保留结果低8位,使用普通的乘法器,都是当成无符号来计算的,与有符号的运算结果往往不同,如下:

正确答案应该如下:


又如这一题:

%eax-%edx,注意这里0x98f0d7b9 是负数,因为9=(1001) 2,符号位为1。

代码思路:

1:数据获取——将输入的数,先去掉0x等前缀,然后变成二进制
2:数据从补码转换为原码——根据最高位(从右到左第32个二进制数)判断符号(补码最高位是符号位,1为负,0正)
接着转化为原码(正数不变。负数除了符号位,其它取反,最后+1)
3:再转化为十进制数(long long型)
4:十进制计算——正如普通四则运算
5:输出十六进制(cout<<hex<<xxx)

更多推荐

有符号16进制计算器