C语言实现原码补码输出

今天复习了一下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;
}
  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值