概述

在计算机内,有符号数有3种表示法:原码、反码和补码。

在计算机中,数据是以补码的形式存储的,所以补码在c语言的教学中有比较重要的地位,而讲解补码必须涉及到原码、反码。

详细释义

所谓原码就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。

反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。

原码、反码和补码的表示方法

定点整数表示法

定点小数小时法

反码

正数:正数的反码与原码相同。

负数:负数的反码,符号位为“1”,数值部分按位取反。

例如: 符号位 数值位

[+7]反= 0 0000111 B

[-7]反= 1 1111000 B

注意:

a. 数0的反码也有两种形式,即

[+0]反=00000000B

[- 0]反=11111111B

b. 8位二进制反码的表示范围:-127~+127

原码

在数值前直接加一符号位的表示法。

例如: 符号位 数值位

[+7]原= 0 0000111 B

[-7]原= 1 0000111 B

注意:

数0的原码有两种形式:

[+0]原= 00000000B

[-0]原= 10000000B

位二进制原码的表示范围:-127~+127

补码

1)模的概念:把一个计量单位称之为模或模数。

例如,时钟是以12进制进行计数循环的,即以12为模。在时钟上,时针加上(正拨)12的整数位或减去(反拨)12的整数位,时针的位置不变。

对于一个模数为12的循环系统来说,加2和减10的效果是一样的;因此,在以12为模的系统中,凡是减10的运算都可以用加2来代替,这就把减法问题转化成加法问题了(注:计算机的硬件结构中只有加法器,所以大部分的运算都必须最终转换为加法)。

10和2对模12而言互为补数。

同理,计算机的运算部件与寄存器都有一定字长的限制(假设字长为8),因此它的运算也是一种模运算。当计数器计满8位也就是256个数后会产生溢出,又从头开始计数。产生溢出的量就是计数器的模,显然,8位二进制数,它的模数为2^8=256。在计算中,两个互补的数称为“补码”。

2)补码的表示:

正数:正数的补码和原码相同。

负数:负数的补码则是符号位为“1”。并且,这个“1”既是符号位,也是数值位。数值部分按位取反后再在末位(最低位)加1。也就是“反码+1”。

例如: 符号位 数值位

[+7]补= 0 0000111 B

[-7]补= 1 1111001 B

补码在微型机中是一种重要的编码形式,请注意:

a. 采用补码后,可以方便地将减法运算转化成加法运算,运算过程得到简化。

正数的补码即是它所表示的数的真值,而负数的补码的数值部份却不是它所表示的数的真值。

采用补码进行运算,所得结果仍为补码。

b. 与原码、反码不同,数值0的补码只有一个,即

[0]补=00000000B。

若字长为8位,则补码所表示的范围为-128~+127;进行补码运算时,应注意所得结果不应超过补码所能表示数的范围。

原码、反码和补码之间的转换

由于正数的原码、补码、反码表示方法均相同,不需转换。

在此,仅以负数情况分析。

(1) 已知原码,求补码。

例:已知某数X的原码为10110100B,试求X的补码和反码

解:由[X]原=10110100B知,X为负数。求其反码时,符号位不变,数值部分按位求反;求其补码时,再在其反码的末位加1。

1 0 1 1 0 1 0 0 原码

1 1 0 0 1 0 1 1 反码,符号位不变,数值位取反

1 1 0 0 1 1 0 0 补码,符号位不变,数值位取反+1

故:[X]补=11001100B,[X]反=11001011B。

(2) 已知补码,求原码。

分析:按照求负数补码的逆过程,数值部分应是最低位减1,然后取反。但是对二进制数来说,先减1后取反和先取反后加1得到的结果是一样的,故仍可采用取反加1 有方法。

例:已知某数X的补码11101110B,试求其原码。

解:由[X]补=11101110B知,X为负数。

1 1 1 0 1 1 1 0 补码

1 1 1 0 1 1 0 1 反码(符号位不变,数值位取反加1)

1 0 0 1 0 0 1 0 原码(符号位不变,数值位取反)

关于补码的补充例子:

一个正的整数的补码就是这个整数变成二进制的值。

举例:一个int型变量i=10,其二进制补码就是0000 0000 0000 0000 0000 0000 0000 1010(0x0000000A)

2. 一个负整数的二进制补码,就是该负数的绝对值所对应的补码全部取反后加1.

举例:int i=-10的补码如何求得:

先求-10的绝对值10的补码是0000 0000 0000 0000 0000 0000 0000 1010(0x0000000A);

再将求得的补码取反: 1111 1111 1111 1111 1111 1111 1111 0101

再将取反后得到的补码加1: 1111 1111 1111 1111 1111 1111 1111 0101 + 1

即可得到-10的二进制补码: 1111 1111 1111 1111 1111 1111 1111 0110(0xFFFFFFF6)

3. +0和-0的二进制补码都是0

首先+0的二进制补码是0;

-0的二进制补码是+0的二进制补码取反后加1,+0的二进制补码为0,取反后为FFFFFFFF,加1后还是0

原码和反码在数值0都有二意,唯有补码在数值0是唯一的码值!

c语言 补码转原码,C语言编程之二进制原码、反码和补码相关推荐

  1. 在标准ASCII码表中,已知英文字母K的十六进制码值是4B,则二进制ASCII码1001000对应的字符是( )

    在标准ASCII码表中,已知英文字母K的十六进制码值是4B,则二进制ASCII码1001000对应的字符是( ). A. G B. H C. I D. J 提示:答案B 解析:K的十六进制4B转换成二 ...

  2. 通过原码、反码、补码彻底搞清左移、右移、无符号右移

    文章目录 原码.反码.补码 有符号右移>> 无符号右移>>> 有符号左移<< 总结有无符号 原码.反码.补码 正数 正数的原码.反码.补码都是该数字的二进制表 ...

  3. 计算机网络中的原码、反码、补码

    写在前面 原码.反码.补码是计算机组成原理中的概念,是计算机网络的基础知识之一.这些概念是为了处理二进制数的符号位而引入的,常用于计算机中的整数运算,也常用于数据存储和传输等领域.因此,了解和掌握这些 ...

  4. 二进制负数的反码补码

    二进制正数的反码,补码,原码都是一样的 负数的话,首先是原码的首位是正数置为1,然后反码就除了符号位都反转,反转之后再加1就是补码. For example: -79 79的原码 01001111 - ...

  5. 原码、反码、补码及位操作符,C语言位操作

    计算机中的所有数据均是以二进制形式存储和处理的.所谓位操作就是直接把计算机中的二进制数进行操作,无须进行数据形式的转换,故处理速度较快. 1.原码.反码和补码 位(bit) 是计算机中处理数据的最小单 ...

  6. 用c语言编程求字符的反码,编程达人 《汇编、C语言基础教程》第一章 进制1.5原码、反码与补码(连载)...

    1.5 原码.反码与补码 计算机存储的数据是以补码的形式体现的,所以就要我们掌握原码.反码与补码的概念. 本节必须掌握的知识点: u 计算机中正数.负数的表现形式 u 原码.反码.补码的概念 假设有个 ...

  7. C语言-整数:short、int、long、long long(signed和unsigned)、原码、反码、补码

    目录 一.实验环境 二.C语言整数简介 1.类型说明符 (1) signed和unsigned (2) 省略书写 2.sizeof运算符-计算当前环境下各类型的字节数 三.整数存储-原码,反码,补码 ...

  8. C语言中八进制和16进制怎么表示,原码,反码及补码,C语言按位取反运算符~

    借鉴被人的 C语言中8进制和16进制怎么表示 C语言本身支持的三种输入是: 1. 十进制.比如20,457: 2. 十六进制,以0x开头.比如0x7a: 3. 八进制,以0开头.比如05,0237 所 ...

  9. C语言简介之进制转换,原码、反码、补码,位运算符,函数

    文章目录 进制转换: 十进制转二进制:(转其他进制) 二进制转十进制: 二进制转八进制: 二进制转十六进制: 原码.反码.补码: 位运算符: & ,|, ~, ^, <<, > ...

最新文章

  1. 不错的工具:Reflector for .NET
  2. 阿里淘宝一直在推的响应式编程到底是个什么鬼?
  3. Apache CXF实现Web Service(3)——Tomcat容器和不借助Spring的普通Servlet实现JAX-RS(RESTful) web service...
  4. oracle的sql口令,Oracle数据库的SYS口令是什么?
  5. 十五、CI框架之自动加载数据库
  6. 浅谈Java两种并发类型——计算密集型与IO密集型
  7. 计算机软件进费用什么科目,购买软件费用如何记账?
  8. lisp 非对称缓和曲线_GIS环境下缓和曲线绘制方法研究
  9. JS继承--圣杯模式的详解
  10. linux ubuntu 播放csf格式视频解决方案
  11. win8 配置要求
  12. tomcat启动成功并能运行项目,但无法显示那只小猫
  13. 绝了!超全面的Java调优方案,我司已用7年,并得到验证!(万能通用)
  14. C++ 类与对象_类的其他成员(常成员,静态成员,友元)
  15. 魔兽地图服务器存档修改本地存档,【Jass】Preload存档系统,本地写入文件并读取...
  16. Unity编辑器开发(七)——Scene界面拓展之Handles
  17. 【腾讯Bugly干货分享】Android 进程保活招式大全
  18. PIC单片机开发环境搭建_MPLAB X IDE安装步骤
  19. [洛谷 P3787] 冰精冻西瓜
  20. Matplotlib Python 画图工具包教程学习笔记4 等高线图以及3D图形的画法

热门文章

  1. word 编辑过程中变为只读_职场小贴士(十一)办公软件小窍门之word篇
  2. vue使用 echarts 3d echarts_esm_echarts__WEBPACK_IMPORTED_MODULE_0__.registerPostInit is not a function
  3. 2022年全球扁藻行业分析报告
  4. SAP HANA跟我学HANA系列之创建分析视图一
  5. Python写入、读取json文件
  6. 求两个数之间的随机数及猜数字游戏
  7. 5分钟完全掌握Python协程
  8. revit二次开发 导出结构柱三角面出现的特殊情况
  9. outlook显示imap服务器已关闭,outlook2010怎么老提示IMAP服务器已关闭连接啊
  10. linux ksh 用户名,linux ksh