一、数的原码、补码和反码表示

机器数和真值

​ 在计算机中,表示数值的数字符号只有0和1两个数码,我们规定最高位为符号位,并用0表示正符号,用1表示负符号。这样,机器中的数值和符号全“数码化”了。为简化机器中数据的运算操作,人们采用了源码、补码、反码及移码等几种方法对数值位和符号位统一进行编码。为区别起见,我们将数在计算机中的这些编码表示为机器数(如10000001),而将原来一般书写表示的数称为机器数的真值(如-0000001)。

原码表示法

原码表示法是一种简单的机器数表示法,即符号和数值表示法。设x为真值,则[x]原码为机器数表示。

例:设x=1100110,则[x]原=01100110。

x=-1100111,则[x]原=11100111。

反码表示法

正数的反码就是真值本身;负数的反码,只需对符号位以外的各位进行“求反”(0变1,1变0)即可。

例:设x=1100110,则[x]反=01100110;

x=-1100111,则[x]反=10011000。

补码表示法

负数用补码表示时,可以把减法转化成假发。整数的补码就是真值本身;负数的补码是符号位为1,数值各位取反(0变为1,1变为0),最低位加1。

例:设x=1100110,则[x]补=01100110;

x=-100111,则[x]补=10011001

​ 从上面关于原码、反码、补码的定义可知:一个正数的原码、反码、补码的表现形式相同,符号位为0,数值位是真值本身;一个负数的原码、反码、补码的符号位都为1,数值位原码是真值本身,反码是各位取反,补码是各位取反,最低位加1.真值0的原码和反码表示不唯一,而补码表示是唯一的,即:

​ [+0]原=000...0,[-0]原=100...0;

​ [+0]反=000...0,[-0]反=111···1;

​ [+0]补=[-0]补=000···0。

注:不同编码表示的整数的范围是这样的(以N位二进制位):

原码:0 ~ 2^n -1 (无符号位),-2^(n-1)-1 ~ 2^(n-1)-1有符号位

反码:-2^(n-1)-1 ~ 2^(n-1)-1不存在无符号情况

补码:-2^(n-1) ~ 2^(n-1)-1不存在无符号情况

​ 原码的特点是容易与真值转换,但做加减运算不太方便。反码弥补了原码加减运算的不足。例如:若X1=97,X2=-97,则X1+X2=0。利用二进制原码运算为:若[X1]原=01100001,[X2]原=11100001,则[X1]原+[X2]原为:

\[\begin{array}{lr}
&01100001\\
+&11100001\\
\hline
&01000010
\end{array}
\]

​ 将结果转换为十进制数就为66,结果显然错误。

​ 若利用反码进行计算,则[X1]反=01100001,[X2]反=10011110,则[X1]反+[X2]反为:

\[\begin{array}{lr}
&01100001\\
+&10011110\\
\hline
&11111111
\end{array}
\]

​ 再将此反码转换为原码,其结果为10000000,即-0.

​ 虽然反码解决了加减运算的问题,但是并没有解决0的两种表示的问题。

​ 补码不仅解决了加减运算的问题,而且0的表示也是唯一的。接着上述的例子,如果利用补码进行运算,[X1]补=01100001,[X2]补=10011111,则[X1]补+[X2]补为:

\[\begin {array}{\r}
&01100001\\
+&10011111\\
\hline
=&00000000
\end{array}
\]

​ 该结果为0,并且没有+0和-0之分。

​ 补码比原码、反码所能表示的范围略宽,1字节(8位)的有符号整数能表示的范围为-128 ~ 127,而原码和反码都只能表示-127 ~ 127,所以补码目前被广泛应用于计算机的数值表示中。

数的定点表示和浮点表示

​ 在计算机中,小数点一般有两种表示方式:一种是小数点固定在某一位置的定点表示法;另一种是小数点的位置可任意移动的浮点表示法。相应于这两种表示的计算机分别称为定点计算机和浮点计算机。

定点表示法

​ 机器中所有数的小数点位置是固定不变的,因而小数点就不必使用记号表示出来。实际上,小数点课固定在任意一个位置上。

浮点表示法

​ 在数的定点表示法中,由于数的表示范围较窄,常常不能满足各种数值问题的需要。为了扩大数的表示范围,方便用户使用,有些计算机采用浮点表示法。表示一个浮点数,要用两部分:尾数和阶码。尾数用以表示数的有效数值;阶码用以表示小数点在该数中的位置。

​ 计算机多数情况下采用浮点数表示数值,它与科学计数法相似,把一个二进制数通过移动小数点位置表示称为阶码和尾数两部分:

\[N=2^e \times S
\]

​ 其中:E为N的阶码(Expeont),是有符号的整数;S为N的尾数(Mantissa),是数值的有效数字部分,一般规定取二进制定点纯小数形式。

例:1011101

\[B=2^{+7} \times 0.1011101
\]

,

101.1101

\[B=2^{+3} \times 0.1011101
\]

,

0.01011101

\[B=2^{-1}\times 0.1011101
\]

NOIP初赛篇——09原码、反码和补码的更多相关文章

  1. [转]C语言的int最值问题,以及原码反码及补码

    以2字节为例来说: 对于无符号的数值(原码反码及补码都一样),最大值为1111  1111  1111  1111=65535 最小值为0000  0000  0000  0000=0 对于有符号的来 ...

  2. C中进制, 原码, 反码与补码的简单用法

    /** * 二进制 binary 如: 1010 * 八进制 octal 如: 070 * 十六进制 hexadecimal 如: 0x7f * * 1Byte = 8bits * 1WORD = 2 ...

  3. Java学习第五篇:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题

    一.二进制,位运算,移位运算 1.二进制 对于原码, 反码, 补码而言, 需要注意以下几点: (1).Java中没有无符号数, 换言之, Java中的数都是有符号的; (2).二进制的最高位是符号位, ...

  4. java 原码反码及补码 总结

    参考: http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html http://blog.csdn.net/lius ...

  5. 原码 & 反码 & 补码 & 详解

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

  6. Java 原码 反码 补码

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

  7. 位移&二进制转换&原码&反码&补码

    << 左移 按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零. 格式 需要移位的数字 << 移位的次数 计算过程 1. 按二进制形式把所有的数字向左 ...

  8. C语言学习笔记之原码反码补码

    原码:就是我们自己看的,以及机器输出给我们看的 补码:机器永远是以补码的形式将数据保存在计算机中 正数: 原码=反码=补码 负数: 反码:原码的符号位不变,其他位取反 ,1变0   0变1 补码:机器 ...

  9. 「C语言」原码反码补码与位运算

    尽管能查到各种文献,亲自归纳出自己的体系还是更能加深对该知识的理解.     本篇文章便是在结合百度百科有关原码.反码.补码和位运算的介绍并深度借鉴了张子秋和Liquor相关文章后整理而出.   目录 ...

随机推荐

  1. 冲刺Day5

    每天举行站立式会议照片: 前后端交互: 昨天已完成的工作: 1.确认搜索栏界面 2.订单模块的大部分代码 3.用户模块的大部分代码 4.测试登录注册功能 燃尽图: 今天计划完成的工作: 成员 任务 高 ...

  2. 开源性能监控分析工具glowroot

    最近在做java性能瓶颈定位分析工具的研究,发现glowroot工具是一款相当不错的APM工具(Wonderful tool),架构简洁,部署简单,上手容易. 经过亲身搭建体验,总结了产品的架构,工具 ...

  3. SPFA算法优化

    前言 \(SPFA\) 通常在稀疏图中运行效率高于 \(Dijkstra\) ,但是也容易被卡. 普通的 \(SPFA\) 时间复杂度为 \(O(km)\) ,其中 \(k\) 是一条边松弛其端点点的 ...

  4. 题解-洛谷P4229 某位歌姬的故事

    题面 洛谷P4229 某位歌姬的故事 \(T\) 组测试数据.有 \(n\) 个音节,每个音节 \(h_i\in[1,A]\),还有 \(m\) 个限制 \((l_i,r_i,g_i)\) 表示 \( ...

  5. CF1406E 【Deleting Numbers】

    蒟蒻语 蒟蒻这次 \(CF\) 又双叒叕掉分了,\(C\) 都没有调出来. 还好再最后 \(10\) 秒钟调了下 \(E\) 块长 (块长 \(100\) => \(98\)),才没有掉得那么惨 ...

  6. AcWing 311 .月之谜

    大型补档补了一年 题目链接 考虑枚举月之数的数列和,然后展开dp预处理 设当前模数为 \(P\) \(f[i][j][k]\) 表示一共有 i 位数字,数位和为 j,数值和 % P 的值为 K \(f ...

  7. 操作系统精髓与设计原理(九)——I/O管理和磁盘调度

    文章目录 I/O设备 I/O功能组织 直接存储器访问 操作系统设计问题 设计目标 IO功能的逻辑结构 I/O缓冲 单缓冲 双缓冲 循环缓冲 缓冲的作用 磁盘调度 磁盘性能参数 磁盘调度策略 先进先出 ...

  8. 简单的一段css代码让全站变灰,网站哀悼代码

    为表达全国各族人民对抗击新冠肺炎疫情斗争牺牲烈士和逝世通报的深切哀悼,国务院今天发布公告,决定2020年4月4日举行全国性哀悼活动.在此期间,全国和驻外使馆下半旗致哀,全国停止公共娱乐活动,4月4日1 ...

  9. Linux下MySQL数据库的备份与恢复

    Linux下MySQL数据库的备份与恢复 作者:Grey 原文地址: Github 语雀 博客园 基于版本 MySQL5.7 Deepin Linux 15.11 xtrabackup-2.4.18 ...

  10. 访问控制列表ACL应用

    ACL的应用的场景 应用在三层接口 • Nat地址转换 Nat(network address translation,地址转换)是将数据报报头中的ip地址转换为另一个ip地址的过程,主要用于实现内部 ...