今天复习了一下C中的原码补码的知识,顺便编程使用for , while, do-while,goto,recursive 实现了补码和原码的输出。
核心思想: 借助一个字符串数组,将得到的原码和补码存储到相应数组中去。在计算原码的时候,由于存在负数的补码等于原码取反+1的这么一个关系,因而只要计算一个在计算机内部存贮着的补码就可以了。而获取补码的方式很简单,只需要依次做位与操作,逐个取出即可。
ps: 这个版本的代码 可以很好的兼容 int short long等数据类型的输出
// ================【5种方式输出补码和原码】======================
// @ author : zhyh2010
// @ date : 20150530
// @ version : 1.1
// @ description : 5 种方式 实现补码 和 原码的输出
//
#define DateType long
#define BitNum 32
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);
}
void findNegCode(DateType num, char * code, int bitNum)
{
DateType inum = num;
// =============【for】============
// for (int i = 0; i != bitNum; i++)
// code[i] = (inum & 1 << (BitNum - 1 - i)) == 0 ? ‘0‘ : ‘1‘;
// =============【while】============
// int i = 0;
// while (i != bitNum)
// code[i++] = (inum & 1 << (BitNum - 1 - i)) == 0 ? ‘0‘ : ‘1‘;
// =============【do while】============
// int i = 0;
// do
// {
// code[i++] = (inum & 1 << (BitNum - 1 - i)) == 0 ? ‘0‘ : ‘1‘;
// } while (i != bitNum);
// =============【goto】============
// int i = 0;
// LOOP:
// code[i++] = (inum & 1 << (BitNum - 1 - i)) == 0 ? ‘0‘ : ‘1‘;
// if (i != bitNum)
// goto LOOP;
// =============【recursive】============
findNegCode_iter(num, code, bitNum, 0);
}
void findOriCode(DateType num, char * code, int bitNum)
{
findNegCode(num, code, bitNum);
if (num > 0)
return;
findNegCode(num * (-1), code, bitNum);
code[0] = ‘1‘;
}
void main()
{
for (DateType num = -5; num != 6; num++)
{
char OriCode[BitNum + 1] = { 0 };
char NegCode[BitNum + 1] = { 0 };
findOriCode(num, OriCode, BitNum);
findNegCode(num, NegCode, BitNum);
printf("num = %d\n\t原码:\t%s\n\t补码:\t%s\n", num, OriCode, NegCode);
}
return;
}
原文地址:http://blog.csdn.net/zhyh1435589631/article/details/46277769