因为计算机存储的都是补码,所以补码可以直接读取,因为电脑储存是小端储存,所以读取的时候得从后往前读取(以一个字节为单位)
从图中可看出int型数字10在内存中的情况
#define _CRT_SECURE_NO_DEPRECATE 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 33 //定义字符串数组长度
typedef struct binary
{
char Yyard[MAX];//原码
char Fyard[MAX];//反码
char Byard[MAX];//补码
}binary;
//进制转化函数,arr传入储存的数组,num待转化的十进制整数,n进制
void decimal(char* arr, int num,int n)
{
char char_num[16];//定义1-16数字的字符
for (size_t i = 0; i < 10; i++)
{
char_num[i] = i + '0';
}
for (size_t i = 0; i < 6; i++)
{
char_num[10 + i] = i + 'A';
}
char buff[MAX];//定义一个逆序存储进制转化后的字符数组
int i = 0;
for ( i = 0;num >=n; i++)
{
buff[i] = char_num[num % n];
num /= n;
}
if (num)//如果还有余数,将余数储存到字符串
{
buff[i] = char_num[num];
i++;
}
buff[i] = '\0';//转化结束加上‘/0’字符串结尾标志
int len = strlen(buff);
for (size_t i = 0; i < len; i++)//将字符串逆序输出至传入的数组里面
{
arr[i] = buff[len - 1 - i];
}
arr[len] = '\0';//添加字符串结束标志
}
//原码转化函数,arr传入储存的数组,num待转化的十进制整数
void Yyard(char* arr, int num)
{
memset(arr, '0', MAX);//初始化数组arr内容全为‘0’
arr[MAX - 1] = '\0';//最后一位打上‘/0’结束标志
if (num<0)//如果是负数,第一位符号位设置为1
{
arr[0] = '1';
}
char str[MAX];
decimal(str,abs(num), 2);//用str储存num绝对值转化的二进制码
int len = strlen(str);
for (size_t j = 0; j < len; j++)
{
arr[MAX - 2 - j] = str[len - 1 - j];//把str从最后一位二进制往前复制给arr
}
}
//反码转化函数,arr传入储存的数组,num待转化的十进制整数
void Fyard(char* arr, int num)
{
Yyard(arr, num);//转化出原码
if (num < 0)
{
for (size_t j = 1; j < MAX - 1; j++)//如果num是负数第一位符号位不变,其余取反
{
if (arr[j] == '1')
{
arr[j] = '0';
}
else
{
arr[j] = '1';
}
}
}
}
//补码转化函数,arr传入储存的数组,num待转化的十进制整数
void Byard(char* arr,int num)
{
memset(arr, '0', MAX);//初始化数组arr内容全为‘0’
arr[MAX - 1] = '\0';//最后一位打上‘/0’结束标志
unsigned char* p = #//将num的地址强转成一字节的无符号字符指针访问
for (size_t i = 0; i <sizeof(int); i++)
{
char str[9];//一次访问8比特的数据+1个‘/0’字符串结尾,一共需要9位数组空间
decimal(str, *(p + 3 - i), 2);//从第四个字节开始一个字节大小往前访问转化输出二进制,因为电脑是小端储存
int len = strlen(str);
for (size_t j = 0; j < len; j++)
{
arr[(i + 1) * 8-1 - j] = str[len - 1 - j];//从字符串的最后一位开始往前依次赋值
}
}
}
//分割打印函数
prin(char* arr,int n)
{
for (size_t i=0; i <MAX; i++)
{
printf("%c", arr[i]);
if ((i+1) % n == 0)//每次输出n个字符后输出一个空格
printf(" ");
}
printf("\n");
}
int main()
{
int num=0,n=2;
char arr[MAX];
printf("int型4字节32比特位\n请输入十进制正数\n");
scanf("%d", &num);
for (int i = 2; i <=16; i++)
{
decimal(arr, num, i);
printf("%d进制:%s\n",i, arr);
}
printf("int型4字节32比特位\n请输入十进制数,将输出二进制原码反码补码\n");
scanf("%d", &num);
binary bin;
Yyard(bin.Yyard, num);//原码
printf("%d的原码为:", num);
prin(bin.Yyard, 4);
Fyard(bin.Fyard, num);//反码
printf("%d的反码为:", num);
prin(bin.Fyard, 4);
Byard(bin.Byard, num);//补码
printf("%d的补码为:", num);
prin(bin.Byard, 4);
return 0;
}