题目描述:
输入一个整数,输出对应的源码、反码和补码(用32位来表示)
参考代码:
#include <stdio.h>
int arrNum[33]; //用来保存转换后的二进制,用32位表示,全局变量所有数组元素已经初始化为0了
void Print()
{//输出此刻的二进制,为了方便运算,之前是倒过来存储的
for (int i = 31; i >= 0; i--)
printf("%d", arrNum[i]);
printf("\n");
}
int main()
{
int studentNumber, i, index = 0, temp;
scanf_s("%d", &studentNumber);
temp = studentNumber < 0 ? -studentNumber : studentNumber;
while (temp) //把整数转换成二进制存放在数组中
{
arrNum[index++] = temp % 2;
temp /= 2;
}
if (studentNumber >= 0)//如果是正数,原码,反码,补码是一致的
{
printf("原码为:\n");
Print();//输出原码
printf("反码为:\n");
Print();//输出反码
printf("补码为:\n");
Print();//输出补码
}
else
{
arrNum[31] = 1;//为了方便计算,反过来存储,如果输入为负数,对应的最高位符号位是31位,设置为1
printf("原码为:\n");
Print();//输出原码
for (i = 0; i < 31; i++) arrNum[i] = 1 - arrNum[i]; //除了符号位以外,全部取反
printf("反码为:\n");
Print();//输出反码
arrNum[0] += 1;//反码加一,求出补码
for (i = 0; i <= 31; i++)//进位操作
if (arrNum[i] >= 2)
{
arrNum[i + 1] += arrNum[i] / 2;
arrNum[i] %= 2;
}
printf("补码为:\n");
Print();//输出补码
}
return 0;
}
输出结果: