#include <stdio.h>
#include <math.h>
#include <malloc.h>
int* convertToBinary(int );
bool judgePlusOrMinus(int* a);
void print(int* p);
int main() {
int a,count; bool flag = true; int* p;
int* p1 = (int*)malloc(33*sizeof(int));//一个int只有4位,这里需要分配整个数组的空间,这个数组是复制给浮点数用的数组
printf("请你输入一个十进制数");
scanf("%d",&a);
flag=judgePlusOrMinus(&a);//这里是判断输入的数正负,用flag来标记,正true负false
p = convertToBinary(a);//这里是转换为32位的2进制数,不管符号位
//下面开始转32位原码
if (!flag)
{
*(p + 31) = 1;
}
printf("原码表示为:");
print(p);
//这里将原码里面的数据复制下来,后面给浮点数用
for (int i = 0; i < 31; i++)
{
*(p1 + i) = *(p+i);
}
count = *(p + 32);
//下面开始转32位反码
if (!flag)
{
for (int i = 0; i < 31; i++)
{
*(p + i) = !*(p + i);
}
}
printf("反码表示为:");
print(p);
//下面开始转补码
if (!flag)
{
for (int i = 0; i < 31; i++)
{
if (*(p + i) == 0) {
*(p + i) = 1;
break;
}
else
{
*(p + i) = 0;
}
}
}
printf("补码表示为:");
print(p);
//下面开始移码
*(p + 31) = !*(p + 31);
printf("移码表示为:");
print(p);
//下面开始浮点数,后面的第1,2个循环有点小复杂
if (count <= 23) {
for (int i = 0; i <=count-2 ; i++)
{
*(p+22-i) = *(p1+count-i-2);
}
for (int i = 0; i <= 22-count+1; i++)
{
*(p + i) = 0;
}
count += 126;
for (int i = 23; i <= 30; i++) {
*(p + i) = count % 2;
count /= 2;
}
}
else
{
for (int i = 0; i <= 22; i++)
{
*(p + i) = *(p1 + i+7);
}count += 126;
for (int i = 23; i <= 30; i++) {
*(p + i) = count % 2;
count /= 2;
}
}
*(p + 31) = !*(p + 31);
printf("浮点数表示为:");
print(p);
}
int * convertToBinary(int a){
static int p[33]; int count=0;
for (int i = 0; i < 31; i++)
{
p[i] = a % 2;
a /= 2;
if (a != 0) {
count = i+2;
}
}
p[32] = count;
return p;
}
bool judgePlusOrMinus(int *a) {
if (*a<0)
{
*a = abs(*a);
return false;
}
return true;
}
void print(int* p) {
for (int i = 31; i >=0; i--)
{
printf("%d",*(p+i));
}
printf("\n");
}