基础知识:
对于正数
正数:原码=反码=补码
对于负数:
原码->补码 和 补码->原码 的规律一样,都是 “取反加1”
eg:以 -3 为例(前面的1,是符号位,0为正,1为负。不参与运算)
原码->补码:111(原码)=100(反码)=101(补码)
补码->原码:101(补码)->110->111(原码)
#define BitNum 8 /*实现的是32位的转化*/
#define DateType int
/*
参数:num: 要做转化的数值
参数:code : 存放得到的二进制数组
参数:bit Num: 数据的位数
参数:cur_iter_num: 递归的次数,初值是0
*/
/*作用:将源码转成补码*/
void findNegCode_iter(DateType num, char * code, int bitNum, int cur_iter_num)
{
/*递归的终止条件*/
if(cur_iter_num == bitNum) return;
/*递归的操作*/ /*三目运算符*/
/*用数组存放 要转化的数值的 每一位的值(位于操作)*/
code[cur_iter_num] = (num & (1<<(BitNum-1-cur_iter_num))) == 0?'0':'1';
findNegCode_iter(num,code,bitNum,cur_iter_num+1);
}
/*作用:将10进制数转化成二进制输出*/
void findOriCode(DateType num,char *code,int bitNum)
{
// findNegcode(num,code,bitNum);
findNegCode_iter(num,code,bitNum,0);
/*递归终止条件*/
if(num>0) return;
/**/
// findNegcode(num*(-1),code,bitNum);
findNegCode_iter(num*(-1),code,bitNum,0);
code[0] = '1';
}
/* 将二进制数转成10进制数*/
int changeDate(char *str)
{
int sum =0;
int j = 1;
/*用作循环上限*/
int pos = BitNum - 1;
for(;pos>=0;pos--)
{
/*刚开始,pos最大,对应的是数组的最右边*/
sum += (str[pos]-'0')*j;
j *= 2;
}
return sum;
}
int main()
{
int Oriresult = 0,Negresult = 0;
char OriCode[BitNum + 1] = { 0 };
char NegCode[BitNum + 1] = { 0 };
/*源码转补码 输入10进制源码,返回二进制补码*/
findNegCode_iter(96,NegCode,BitNum,0);
/* 将二进制数转成10进制数*/
Negresult = changeDate(NegCode);
printf("Negresult = %d\n",Negresult);
/*原码的补码 二进制输出*/
findOriCode(Negresult, NegCode, BitNum);
printf("Negresult=%s\n", NegCode);
/*补码转原码 输入10进制补码,返回二进制原码*/
findNegCode_iter(74,OriCode,BitNum,0);
/* 将二进制数转成10进制数*/
Oriresult = changeDate(OriCode);
printf("Oriresult = %d\n",Oriresult);
/*补码对应的原码二进制输出*/
findOriCode(Oriresult, OriCode, BitNum);
printf("Oriresult=%s\n", OriCode);
return 0;
}