有这么一道题目:

编写函数,实现输入一个数,输出该数的原码、反码和补码

一开始我并没有用位运算的思路,于是写下了下面长长的一段代码:
(假设我输入-1754)

#include <stdio.h>
#include <math.h>int positive(int num) //用于计算正数
{int i,a[1000],b=1,c;for (i=0; i<1000; i++) {a[i]=num%2;num=num/2;if (num<1){b=i;break;}}a[b+1]=0;printf("ture code is ");for (i=b+1; i>=0; i--){printf("%d",a[i]);}printf("\nones-complement code is ");for (i=b+1; i>=0; i--) {c=a[i];c=~c&1;   //必须要有,不然会11111111的cprintf("%d",c);}printf("\ncomplemental code is ");for (i=b+1; i>=0; i--){printf("%d",a[i]);}printf("\n");return 0;
}int negetive(int num)  //计算负数
{int i,a[1000],d[1000],b=1,c,e = 0,numb;numb=num;num=-num;for (i=0; i<1000; i++) {a[i]=num%2;num=num/2;if (num<1){b=i;break;}}num=-numb;num=~num;  //此处num输出会出现-1755,原因是现在机器普遍用补码表示负数num=num+1;printf("%d\n",num);for (i=0; i<1000; i++) {//注意此处for循环是错误的d[i]=num%2;num=num/2;if (num>-1){e=i;break;}}a[b+1]=1;d[e+1]=1;printf("ture code is ");for (i=b+1; i>=0; i--){printf("%d",a[i]);}a[b+1]=0;printf("\nones-complement code is ");for (i=b+1; i>=0; i--) {c=a[i];c=~c&1;   //必须要有不然会11111111printf("%d",c);}printf("\ncomplemental code is ");for (i=e+1; i>=0; i--){printf("%d",d[i]);}printf("\n");return 0;
}int main()  //主程序
{int num;printf("please input a number:\n");scanf("%d",&num);if (num>0) {positive(num);}else if (num==0)printf("0000000000000000\n1111111111111111\n0000000000000000");elsenegetive(num);
}

没有引入位运算会使得整个代码冗长,不过复杂无所谓,正确就可以了。
可是他不正确啊。。对于正数的输出是无问题的,一旦进入负数,其补码就会错误。
为什么呢?我们把负数for循环部分单独拎出来看一下:

num=-numb; //第一步让num重新变为1754num=~num;  //对1754求反码,此处num输出会出现-1755,原因是现在机器普遍用补码表示负数,于是求完反码之后机器直接认为此处是一个补码,就会按照补码的读取方式读取num=num+1;  //此处是对-1755+1=-1754for (i=0; i<1000; i++) //注意此处for循环是错误的,将-1754输入进入了循环{d[i]=num%2;  // 此处都是负数num=num/2;if (num>-1){e=i;break;}}  // 因为是负数,这样一来后面输出就会出错

于是我采用位运算写法简化了二进制输出:

  for(i=15;i>=0;i--)  //默认16位{b=a>>i;     //每次循环逐个读取最后一个数b=b&~(~0<<1);   //此处xcode会报警报提示未定义的左移,可以用b=b&~(~0-1)来代替printf("%hd",b); }}

这串代码甚至不需要对正负数进行区分,如果是负数机器默认就是用补码储存,故直接读出来就可以了。

关于将一个数输出为原码、反码和补码的解惑相关推荐

  1. java用的原码还是反码_java 原码 反码 和补码

    --------- 原码.补码.反码 计算机是数字电路设备,由复杂的电子元器件组合而成,一个电子元器件在工作时,可以分为两种状态--高电平和低电平,表示数据用高电平表示1,低电平表示0,而多个电子元器 ...

  2. c语言 原码反码和补码

    计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的. 原码 一个数的原码(原始的二进制码)有如下特点: 1.最高位做为符号位,0表示正,为1表示负 2.其它数值部分就是数值本身 ...

  3. 计算机真值范围,计算机的机器数,真值,原码, 反码和补码

    机器数 一.数的符号数值化.实用的数据有正数和负数,由于计算机内部的硬件只能表示两种物理状态(用0和1表示),因此实用数据的正号"+"或负号"-",在机器里就用 ...

  4. 原码反码和补码,一篇就够了,全网最详细解析

    其实对于计算机来说,并不存在原码和反码,计算机存储的二进制数据都是以补码的形式存放的,自然对数据的运算也是直接用补码来运算(计算机中只有加法器没有减法器) 我们都知道正整数(包括0)的补码是它本身,负 ...

  5. 计算机原码 反码 和 补码

    一.机器数和真值 1. 机器数 一个数在计算机中的二进制表示,叫做这个数的机器数.在计算机中最高位为符号位.0代表正数,1代表负数. +1 机器数(8位):0000 0001 -1 机器数(8位):1 ...

  6. 负数的原码反码和补码

    As we all know,正数的三码都一样,注意一下最高位为符号位即可: 负数的原码最高位为1,与真值之间换算方便,但对于做减法的操作却很无力,于是引进了反码和补码:负数的反码为它的正数按位取反, ...

  7. c语言原码 补码 反码,C语言 原码--反码--补码

    //原码,反码,补码 #include #include //数值的表示方法--原码.反码和补码 //原码:最高位为符号位,其余各位为数值本身的绝对值 //反码: //正数:反码与原码相同 //负数: ...

  8. 关于计算机中 原码, 反码, 补码 详解

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...

  9. 原码, 反码, 补码, 移码 详解

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...

最新文章

  1. JavaScript 函数
  2. CCBPM工作流引擎的消息机制与设计
  3. od 追踪_裁判员行为规范【基本功】——追踪裁判违例宣判练习 /五秒违例
  4. python logging模块之handlers的使用教程
  5. 机器学习-sk-learn-Facebook数据集预测签到位置
  6. opencore0.6.4_心灵终结3.3.4
  7. reached getOption(max.print) -- omitted 428 rows ]
  8. python脚本语言采用声音作为手段_python 利用pyttsx3文字转语音过程详解
  9. std中稳定排序算法_源代码库已开放 | 哈工大硕士生用 Python 实现了 11 种经典数据降维算法...
  10. python科学编程入门书_Python数据科学零基础一本通
  11. esp8266烧录Html文件,实现内置网页控制设备!
  12. AS3的Vector的初始化
  13. 理解JavaScript原型
  14. thinkphp5(tp5)中success跳转页面和弹窗问题解决
  15. 为资产分类定义折旧范围_固定资产分类标准及折旧方法5
  16. ASP.NET中Dictionary的基本用法
  17. Extjs6开发环境搭建
  18. homelede软路由设置方法_软路由LEDE折腾overlay分区扩容之路
  19. 创建Qsys_PIO IP核
  20. 图文讲解flashfxp教程 flashfxp详细教程

热门文章

  1. Sql 常用日子转换Convert
  2. NumericUpDown 控件输入限制小数位
  3. 如何解决多线程并发问题
  4. python开发一个区块链只需40多行
  5. solaris10找安装包的地方
  6. Emmet (ZenCoding) 缩写语法
  7. SD-WAN5年增长率超过40%,为什么越来越受到企业欢迎?
  8. BZOJ1415[Noi2005]聪聪和可可——记忆化搜索+期望dp
  9. Codeforces Round #247 (Div. 2)C. k-Tree(动态规划)
  10. mysql恢复root密码