有符号16进制计算器

用途:计算机里面的数据是用补码储存的,此代码适用于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)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值