用途:计算机里面的数据是用补码储存的,此代码适用于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进制计算器
发布评论