admin管理员组

文章数量:1794759

有符号16进制计算器

有符号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)

本文标签: 计算器符号