#include "stdio.h"
#include <stdlib.h>
#include <string.h>
#define TTWO 32
#define TONE 31
//*x>-2147483648 && x<2147483648;
#define MAXSIZE 65
void function_one(double m)
{
char sign;//符号
char Stack[MAXSIZE];//栈
int top=-1,i=0,Zhengshu_len=0,Xiaoshu_len = 0,e,e_len=0,Finally_len=0;
char yushu;
int zhengshu;
char Zhengshu[MAXSIZE];
char Xiaoshu[MAXSIZE];
char Finally[MAXSIZE];
int SignedInteger;//x的整数部分
float decimal;//x的小数部分
// printf("请输入一个有符号的十进制数:");
// scanf(" %c",&sign);
if(m>0)
{
sign='+';
}
else if(m<0)
{
sign='-';
m=-m;
}
SignedInteger = (int) m;
decimal = m - SignedInteger;
//十进制整数部分转bai二进制
if(SignedInteger ==0 && decimal==0)
{
printf("0000 0000 0000 0000 0000 0000 0000 0000\n");
printf("00000000\n");
}
else if(SignedInteger == 0)
{
i=0;
while(decimal>0)
{
zhengshu = (int)(decimal*2);
Xiaoshu[i] = zhengshu+'0';
i++;
decimal = decimal * 2;
if(decimal>=1) decimal = decimal -1 ;
}
Xiaoshu[i] = '\0';
Xiaoshu_len = i;
int record=1;//记录
for(i=0;i<Xiaoshu_len;i++)
{
if(Xiaoshu[i]=='0')
{
record++;
}
else
{
break;
}
}
e = 127-record;
printf("e=%d\n",e);
if(sign=='+')
{
Finally[0] = '0';
}
else if(sign=='-')
{
Finally[0] = '1';
}
i = 8;
while(e)
{
yushu = (e%2+'0');
Finally[i] = yushu;
i--;
e = e/2;
}
//阶前补0凑八位
for(i=1;i<=8;i++)
{
if(Finally[i]!='1')
{
Finally[i] = '0';
}
else
{
break;
}
}
int j = record;
//补小数,因为没有整数部分
for(i=9;i<9+Xiaoshu_len+record;i++)
{
Finally[i] = Xiaoshu[j++];
}
Finally_len = strlen(Finally);
for(i=Finally_len;i<32;i++)
{
Finally[i] = '0';
}
for(i=0;i<32;i++)
{
printf("%c",Finally[i]);
if(i%4==0)
{
printf(" ");
}
}
putchar('\n');
}
else{
while(SignedInteger)
{
yushu = (SignedInteger%2+'0');
top++;
Stack[top] = yushu;
SignedInteger = SignedInteger/2;
}
while(top!=-1)
{
Zhengshu[i] = Stack[top];
top--;
i++;
}
Zhengshu[i] = '\0';
Zhengshu_len = i;
//十进制小数转二进制
i=0;
while(decimal>0)
{
zhengshu = (int)(decimal*2);
Xiaoshu[i] = zhengshu+'0';
i++;
decimal = decimal * 2;
if(decimal>=1) decimal = decimal -1 ;
}
Xiaoshu[i] = '\0';
Xiaoshu_len = i;
e = 127+Zhengshu_len-1;
//求阶
printf("e=%d\n",e);
i = 8;
while(e)
{
yushu = (e%2+'0');
Finally[i] = yushu;
i--;
e = e/2;
}
//阶前补0凑八位
for(i=1;i<=8;i++)
{
if(Finally[i]!='1')
{
Finally[i] = '0';
}
else
{
break;
}
}
if(sign=='+')
{
Finally[0] = '0';
}
else if(sign=='-')
{
Finally[0] = '1';
}
int j=1;
//添加整数部分
for(i=9;i<9+Zhengshu_len-1;i++)
{
Finally[i] = Zhengshu[j++];
}
Finally[i] = '\0';
Finally_len = strlen(Finally);
j=0;
//添加小数部分
for(i=Finally_len;i<Finally_len+Xiaoshu_len;i++)
{
Finally[i] = Xiaoshu[j++];
}
Finally[i]='\0';
Finally_len = strlen(Finally);
for(i=Finally_len;i<32;i++)
{
Finally[i] = '0';
}
for(i=0;i<32;i++)
{
printf("%c",Finally[i]);
if(i%4==0)
{
printf(" ");
}
}
putchar('\n');
}
//转化为16进制
if(x!=0)
{
int sum=0,j=1,t=8;
for(i=0;i<32;i++)
{
// printf("!%d\n",Finally[i]-'0');
sum+=t*(int)(Finally[i]-'0');
//printf("*%d\n",sum);
t = t/2;
//sum = (int)(Finally[i]-'\0')*8+ (int)(Finally[i]-'\0')*4 +(int)(Finally[i]-'\0')*2+ (int)(Finally[i]-'\0')*1;
if(j%4==0)
{
t = 8;
//printf("sum=%d\n",sum);
if(sum==10) printf("A");
else if(sum==11) printf("B");
else if(sum==12) printf("C");
else if(sum==13) printf("D");
else if(sum==14) printf("E");
else if(sum==15) printf("F");
else printf("%d",sum);
sum=0;
}
j++;
}
putchar('\n');
}
}
void integertrueform(int x,int map[])
{ if(x>=0) map[TONE]=0;
if(x<0) {map[TONE]=1; x=-x;}
int i=1;
while(x&&(i-TTWO))
{
map[i-1]=x%2;
i++;
x=x/2;
}
}
void decimaltrueform(double x,int map[])
{ if(x>=0) map[TONE]=0;
if(x<0) {map[TONE]=1; x=-x;}
int i=TONE;
while(x!=0&&i)
{ x=x*2;
if(x>=1) {map[i-1]=1;x--;}
else map[i-1]=0;
i--;
}
}
void ptrueform(int map[])
{
int i=TTWO;
while(i)
{
printf("%d",map[i-1]);
i--;
}
}
int onescomplement(int map[])
{ int i;
if(map[TONE]==0)
{
return 0;
}
else
{ i=TONE;
while(i>0)
{
if(map[i-1]==1) map[i-1]=0;
else map[i-1]=1;
i--;
}
}
}
void ponescomplement(int map[])
{
int i=TTWO;
while(i>0)
{
printf("%d",map[i-1]);
i--;
}
}
int complemental(int map[])
{ if(map[TONE]==0) return 0;
else
{ int i=0;
while(map[i]&&i<TTWO)
{
map[i++]=0;
}
map[i]=1;
}function_one(ti);
}
void pcomplemental(int map[])
{
int i=TTWO;
while(i>0)
{
printf("%d",map[i-1]);
i--;
}
}
int excess(int map[])
{
if(map[TONE]==1) map[31]=0;
else map[TONE]=1;
}
void pexcess(int map[])
{
int i=TTWO;
while(i>0)
{
printf("%d",map[i-1]);
i--;
}
}
main()
{ int a[TTWO]={0},z[TTWO]={0};
int ti = 0;
double td = 0;
double tdf=0;
int tdi=0;
char str[10]="";
printf("请输入一个十进制数:");
scanf("%s",str); // 先存成字符串
if (NULL == strchr(str, '.')) // 等于NULL是没有找到小数点
{
sscanf(str, "%d", &ti); // 再从字符串格式化成整型
printf("输入的是定点整型:%d\n", ti);
integertrueform(ti,a);
printf("原码:");
ptrueform(a);
function_one(ti);//IEEE754
printf("\n");
onescomplement(a);
printf("反码:");
ponescomplement(a);
printf("\n");
complemental(a);
printf("补码:");
pcomplemental(a);
printf("\n");
excess(a);
printf("移码:");
pexcess(a);
printf("\n");
}
else
{
sscanf(str, "%lf", &td); // 再从字符串格式化成浮点型
printf("输入的是浮点数:%lf\n", td);
if(td<1&&td>-1)
{
decimaltrueform(td,a);
printf("定点小数原码:");
ptrueform(a);
printf("\n");
onescomplement(a);
printf("定点小数反码:");
ponescomplement(a);
printf("\n");
complemental(a);
printf("定点小数补码:");
pcomplemental(a);
printf("\n");
excess(a);
printf("定点小数移码:");
pexcess(a);
printf("\n");
}
if(td>=1||td<=-1)
{
tdi=(int)td;
tdf=td-tdi;
integertrueform(tdi,a);
decimaltrueform(tdf,z);
printf("原码整数部分:");
ptrueform(a);
printf(" ");
printf("原码小数部分:");
ptrueform(z);
printf("\n");
onescomplement(a);
printf("反码整数部分:");
ponescomplement(a);
printf(" ");
onescomplement(z);
printf("反码小数部分:");
ponescomplement(z);
printf("\n");
complemental(a);
printf("补码整数部分:");
pcomplemental(a);
printf(" ");
complemental(z);
printf("补码小数部分:");
pcomplemental(z);
printf("\n");
excess(a);
printf("移码整数部分:");
pexcess(a);
printf(" ");
excess(z);
printf("移码小数部分:");
pexcess(z);
printf("\n");
}
function_one(td);
}
}
运行结果