用C实现:给出一个十进制数,可以是整数,也可以是小数。经过数据处理之后,输出这个数的原码,反码,补码,和移码的表示方法。其中整数部分和小数部分分别用32位机器数表示。再输出这个数的单精度浮点数。
问题描述:
给出一个十进制数,可以是整数,也可以是小数。经过数据处理之后,输出这个数的原码,反码,补码,和移码的表示方法。其中整数部分和小数部分分别用32位机器数表示。再输出这个数的单精度浮点数。
答
如果有帮助请点一下我回答右上方的采纳,谢谢!以后有什么问题可以互相交流。
#include "stdio.h"
#include <stdlib.h>
#include <string.h>
#define TTWO 32
#define TONE 31
//*x>-2147483648 && x<2147483648;
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;
}
}
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--;
}
}
/*void ITEID(int map[])
{ int i=TTWO;int j[TTWO]={0};int e[8]={0};int c=22;
while(i)
{
if(map[i--]==1) {break;i--;}
}
integertrueform(i,e);
j[23]=map[TONE];
while(i&&c+1)
{
j[c--]=map[i--];
}
printf("ITEEE754浮点数:0");
int y=31;
while(y>24)
{
printf("%d",e[y--]);
}
c=23;
while(c+1)
{
printf("%d",j[c--]);
}
printf("\n");
}
/*void ITEI
void ITED */
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);
/* ITEID(a);*/
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");
}
}
}