#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<string>
#include<algorithm>
#define HALFINT 0x8000
using namespace std;
typedef unsigned int word;
typedef unsigned char byte;
typedef unsigned dwrd;
word atom(char* s){//字符串转换成对应的二进制原码
word u=0;
int i;
i=(s[0]=='-')?1:0;
for(;s[i]!=0;i++){
u=(u*10)+(s[i]-'0');
}
u=(s[0]=='-')?(HALFINT|u):u;
return u;
}
word add(word x,word y){//原码加法,返回的是运算结果的原码
word tempx=x&0x7FFF,tempy=y&0x7FFF,result;
if((!(x&HALFINT))&&(y&HALFINT)){
result=tempx-tempy;
}
else if((x&HALFINT)&&(!(y&HALFINT))){
result=tempy-tempx;
}
else if((x&HALFINT)&&(y&HALFINT)){
result=-tempx-tempy;
}
else if((!(x&HALFINT))&&(!(y&HALFINT)))
result=tempx+tempy;
if(result&HALFINT){
result=~result+1;
result=result&0x7FFF;
result=result|HALFINT;
}
return result;
}
word sub(word x,word y){//原码减法,返回的是运算结果的原码
if(!(y&HALFINT)){
y=y|HALFINT;
}
else{
y=y&0x7FFF;
}
return(add(x,y));
}
word mul(word x,word y){//本程序通过1位booth算法实现乘法运算,先将原码转化成补码,再将1位booth算法的运算结果转化成原码返回 可接受的参数范围为[-127,127]
word mm=0;
if(x==0||y==0)
return 0;
if(x&HALFINT){
x=x&0x7FFF;
x=-x;
}
if(y&HALFINT){
y=y&0x7FFF;
y=-y;
}
mm=(y<<1)&0xFFFF;
word addx=x<<16;
word subx=-addx,cnt=0;
while(cnt<15){
if((mm&3)==1){
mm+=addx;
}
else if((mm&3)==2){
mm+=subx;
}
mm>>=1;
cnt++;
}
mm>>=1;
mm=mm&0xFFFF;
if(mm&HALFINT){
mm=~mm+1;
mm=mm&0xFFFF;
mm=mm|HALFINT;
}
return mm;
}
word div(word x,word y){//本程序通过加减交替算法实现除法运算,先计算|x|/|y|,再判断运算结果的符号
if(x==0)
return 0;
word div,addy,quo=0,mod,sign,cnt=0;
sign=(x&HALFINT)^(y&HALFINT)?-1:1;
if(x&HALFINT){
div=x&0x7FFF;
}
else{
div=x;
}
if(y&HALFINT){
addy=y&0x7FFF;
}
else{
addy=y;
}
mod=div;
addy=addy<<16;
while(cnt<17){
mod-=addy;
quo=quo<<1;
if(mod&0x80000000){
mod+=addy;
}
else{
quo=quo|0x0001;
}
addy=addy>>1;
cnt++;
}
if(sign==-1){
quo=quo|HALFINT;
}
return quo;
}
word mmod(word x,word y){//余数通过公式 被除数=除数*商+余数 运算而来
word quo=div(x,y);
word pro=mul(quo,y);
word mod=sub(x,pro);
return mod;
}
word expend(word x){//位扩展运算,用于将16位二进制数扩展成32位二进制数
if(x&HALFINT){
x=x&0x7FFF;
x=x|0x80000000;
}
else{
x=x|0x00000000;
}
return x;
}
word compare(word x,word y){//大小比较通过两数之间的减法运算结果是否为0以及符号判断来实现
word result;
if((sub(x,y)&0x7FFF)==0){
result=0;
}
else
result=(sub(x,y)&HALFINT)?-1:1;
return result;
}
string mtoa(word u){//二进制转换成字符串
string s;
word i=0,j,sign=0;
if(u&HALFINT){
sign=1;
}
u=u&0x7FFF;
word mod,ten=10;
do{
mod=mmod(u,ten);
s+=mod+'0';
u=div(u,ten);
}while(u);
if(sign){
s+='-';
}
reverse(s.begin(),s.end());
return s;
}
int main(){
char s[80];
word x,y,z;
scanf("%s",s);
x=atom(s);
scanf("%s",s);
y=atom(s);
if(((x&0x7FFF)&0xFFFF8000)||((y&0x7FFF)&0xFFFF8000)){
printf("输入发生了溢出!\n");
return 0;
}
printf("x=%x,y=%x\n",x,y);
z=expend(x);
printf("x扩展成32位后的结果是:%x\n",z);
z=expend(y);
printf("y扩展成32位后的结果是:%x\n",z);
word tempx=x&0x7FFF;
word tempy=y&0x7FFF;
word tempz=add(tempx,tempy);
if(tempz&HALFINT){
printf("加减法运算发生了溢出!\n");
return 0;
}
z=add(x,y);
cout<<mtoa(x);
printf("(%x)+",x);
cout<<mtoa(y);
printf("(%x)=",y);
cout<<mtoa(z);
printf("(%x)\n",z);
z=sub(x,y);
word cmp=compare(z,0);
if(cmp){
if(cmp==1){
printf("x>y\n");
}
else if(cmp==-1){
printf("x<y\n");
}
}
else{
printf("x==y\n");
}
cout<<mtoa(x);
printf("(%x)-",x);
cout<<mtoa(y);
printf("(%x)=",y);
cout<<mtoa(z);
printf("(%x)\n",z);
tempz=mul(tempx,tempy);
if((tempx!=0)&&(tempy!=0)){
if(tempz&0x8000){
printf("乘法运算发生了溢出!\n");
return 0;
}
tempz=mul(tempx|0x8000,tempy);
if(!(tempz&0x8000)){
printf("乘法运算发生了溢出!\n");
return 0;
}
tempz=mul(tempx,tempy|0x8000);
if(!(tempz&0x8000)){
printf("乘法运算发生了溢出!\n");
return 0;
}
tempz=mul(tempx|0x8000,tempy|0x8000);
if(tempz&0x8000){
printf("乘法运算发生了溢出!\n");
return 0;
}
}
z=mul(x,y);
cout<<mtoa(x);
printf("(%x)*",x);
cout<<mtoa(y);
printf("(%x)=",y);
cout<<mtoa(z);
printf("(%x)\n",z);
if(y==0){
printf("除数为0!\n");
return 0;
}
z=div(x,y);
cout<<mtoa(x);
printf("(%x)/",x);
cout<<mtoa(y);
printf("(%x)=",y);
cout<<mtoa(z);
printf("(%x)\n",z);
z=mmod(x,y);
cout<<mtoa(x);
printf("(%x)mod",x);
cout<<mtoa(y);
printf("(%x)=",y);
cout<<mtoa(z);
printf("(%x)\n",z);
return 0;
}