**

八位二进制数能表示数的范围以及原码、反码和补码含义

**

首先八位二进制数0000 0000 ~1111 1111,一共可以表示2^8=256位数,如果表示无符号整数可以表示0~255。计算方法就是二进制与十进制之间的转换。

如果想要表示有符号整数,就要将最前面一个二进制位作为符号位,即0代表正数,1代表负数,后面7位为数值域,这就是原码定义。这样在现实生活中完全没有问题,但在计算机中就出现了问题。

数的表示:
在原码中,0的表示有两种(+0)0000 0000、(-0)1000 0000,这样就产生了编码映射的不唯一性,在计算机上就要区分辨别。然而+0、-0却没有什么现实意义。
数的运算:
为了解决上述数的表示问题,我们可以强制把转换后的10000000强制认定为-128。但这又出现了一个新的问题就是数的运算。数学上,1+(-1)=0,而在二进制中00000001+10000001=10000010,换算成十进制为-2。显然出错了。所以原码的符号位不能直接参与运算,必须和其他位分开,这就增加了硬件的开销和复杂性。
这个时候就要引入补码,补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。反码定义为:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
但为什么要引入补码呢?
以及负数补码定义为什么是相对应的正数原码取反加一?
先解决第一个问题,引入补码是为了解决计算机中数的表示和数的运算问题,使用补码,可以将符号位和数值域统一处理,即引用了模运算在数理上对符号位的自动处理,利用模的自动丢弃实现了符号位的自然处理,仅仅通过编码的改变就可以在不更改机器物理架构的基础上完成的预期的要求。

要解决第二个问题同时理解补码,首先要理解“模”。
模的概念可以帮助理解补数和补码。
“模”是指一个计量系统的计数范围。如时钟等。计算机也可以看成一个计量机器,它也有一个计量范围,即都存在一个“模”。例如:
时钟的计量范围是0~11,模=12。表示n位的计算机计量范围是0~2(n)-1,模=2(n)。

“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数。任何有模的计量器,均可化减法为加法运算。

例如:假设当前时针指向10点,而准确时间是6点,调整时间可有以下两种拨法:一种是倒拨4小时,即:10-4=6;另一种是顺拨8小时:10+8=12+6=6
在以12模的系统中,加8和减4效果是一样的,因此凡是减4运算,都可以用加8来代替。对“模”而言,8和4互为补数。实际上以12模的系统中,11和1,10和2,9和3,7和5,6和6都有这个特性。共同的特点是两者相加等于模。

对于计算机,其概念和方法完全一样。n位计算机,设n=8,不讨论符号位, 则所能表示的最大数是11111111,若再加1成为100000000(9位),但因只有8位,最高位1自然丢失。又回了00000000,所以8位二进制系统的模为2^9。在这样的系统中减法问题也可以化成加法问题,只需把减数用相应的补数表示就可以了。把补数用到计算机对数的处理上,就是补码。

接下来就是取反加一的来源:

例如-8,可以看做0-8,即0000 0000 - 0000 1000,小减大,像高位借一,即1 0000 0000 - 0000 1000 = 1111 1000,这个可以看做用模数来减去该数,会得到该数的补数。同时上式也可以看做 (1111 1111 - 0000 1000)+1,即0000 1000 取反加1。

负数补码定义是相对应的正数原码取反加一,这个同负数的反码末尾加一是同样的效果。注意看反码的定义。取反加一是逐位取反,包括符号位。

对一个正数的原码取反加一,得到这个正数对应负数的补码。例如~6=-7,而且加一之后会多出一个八进制补码1000 0000,而这个补码就对应着原码1000 0000,数字位同时当做符号位即-128。

根据以上内容我们就可以来解释八位二进制数的表示范围

八位二进制正数的补码范围是0000 0000 ~ 0111 1111 即0 ~ 127,负数的补码范围是正数的原码0000 0000 ~ 0111 1111 取反加一(也可以理解为负数1000 0000 ~ 1111 1111化为反码末尾再加一)。
所以得到 1 0000 0000 ~ 1000 0001,1000 0001作为补码,其原码是1111 1111(-127),依次往前推,可得到-1的补码为1111 1111,那么补码0000 0000的原码是1000 0000符号位同时也可以看做数字位即表示-128,这也解释了为什么127(0111 1111)+1(0000 0001)=-128(1000 0000)。

总结
在计算机中数据用补码表示,利用补码统一了符号位与数值位的运算,同时解决了+0、-0问题,将空出来的二进制原码1000 0000表示为-128,这也符合自身逻辑意义的完整性。因此八位二进制数表示范围为-128~+127。

作者:曲行客
来源:CSDN
原文:https://blog.csdn.net/fenzang/article/details/53500852
版权声明:本文为博主原创文章,转载请附上博文链接!

正负数的二进制(转)相关推荐

  1. 计算机底层的二进制表达——正负数与二进制转换方法及代码

    以下均是以64位计算机为例,故int类型是4字节,即32位二进制数. 文章目录 1 十进制数转为二进制 1.1 正数的二进制 1.2 负数的二进制 2 正负数与原码.反码.补码 2.1 原码 2.2 ...

  2. 计算机系统基础知识——详解二进制正负数及补码设计

    前言:关于二进制数的补码反码等各种码,上学时候只学会了死记硬背却还是一头雾水,不懂这样设计的意义.所以总是隔很多时间后还是记不住,今天就尝试用自己的理解解释下正负数以及补码的设计,如果有不对的地方或者 ...

  3. 二进制正负数转换和移位的规则详解

    1.转换规则 二进制整数都是以补码的形式出现的 正数的原码.反码.补码都相同 负数的反码就是正数的原码先把最高位变为1然后其余的位取反 负数的补码就是该负数的反码加1. 2.二进制的移位规则 < ...

  4. 二进制正负数的表示法

    数在数字电路中的二进制表示形式成为机器数,在通常的算术运算中,用"+"."-"表示正数和负数,而数字电路不识别"+","-&quo ...

  5. c语言中二进制用什么字母表示方法,看C语言编码转换--------负数的二进制表示方法...

    今天在看C语言编码转换时,既然对负数的二进制表示有些遗忘,查了下网上的资料,他们说的是个P!误人子弟!和大家讨论了下,贴出来已备在此遗忘: 假设有一个 int 类型的数,值为5,那么,我们知道它在计算 ...

  6. java负数转换二进制表示_Java中的负数的在计算机中的二进制表示,以及与十进制的相互转换...

    我们知道数字在计算机中都是以二进制表示的,数字类型有:byte,short,int,long 我给计算机一个数字,计算机首先要确定他的类型,因为不同类型占有的空间是不一样的,     byte占有一个 ...

  7. 正负数在计算机中的表示(原码反码补码)及位运算

    负数在现代计算机里一般用补码表示(正数也是) 正数补码就是它的原码 负数补码: 最高位是符号位,其余位为对应整数的原码取反再+1 如:1000 0000还原为原码:最高位是1,表示负数,剩余的各位取反 ...

  8. JAVA入门-024(int的正负数)

    int的正负数I int的正负数 int的正负数 首先要了解什么是二进制的反码和补码. 以下为一个int类型的二进制数字: 00000000 00000000 00000000 00101101 他所 ...

  9. Java位运算,负数的二进制表示形式,int类型最大值为什么是2的31次方-1

    目录 二进制中负数怎么表示? Java位运算 按位运算 移位运算 int类型的取值范围是多少? 二进制中负数怎么表示? 在进行位运算之前,先看看负数的二进制形式在计算机中是如何表示的,在计算机中所有的 ...

最新文章

  1. Ubuntu13.10:[3]如何开启SSH SERVER服务
  2. r语言直方图_R语言绘制频率直方图
  3. 【分享】 自闭症儿童网络画展 - JS效果
  4. ADSL pppoe 拔号工具rp-pppoe
  5. linux 脚本 java_Linux 通过脚本执行Java程序
  6. (数据库系统概论|王珊)第七章数据库设计:习题
  7. php 查看磁盘挂载,linux如何查看磁盘使用情况
  8. Android串口控制台改为root
  9. ColorPic 一套簡單好用的顏色選擇器!
  10. (转)DevOps,就是开发吃掉运维?
  11. CocosCreator休闲游戏发布到字节跳动平台
  12. VS连接VSS代码管理器失败问题
  13. ACM-ICPC 2018北京网络赛-A题 Saving Tang Monk II-优先队列
  14. cad图层置顶的lisp_CAD图层遮挡,如何将CAD图形进行前置或者后置?
  15. meta标签是什么,通常包含哪些内容?
  16. IKBC键盘win键失灵解决方法
  17. 阿里薪资谈判技巧_如何像专业人士一样处理技术职业中的薪资谈判
  18. 求微分方程用c语言怎么表达,使用C语言解常微分方程 C ODE
  19. 【170】◀▶ IDL 学习初体验-全
  20. 3DMark2005终于过4000了

热门文章

  1. 用Swift做个游戏Lecture04 —— 仙人掌的狙击
  2. 《程序员必读之软件架构》
  3. C语言规范:C89、C90、C95、C99及C89和C99区别
  4. 计算机视觉在 IoT 领域的实践应用
  5. docker构建hadoop镜像、docker-compose启动hdfs
  6. syntax和semantics的区别
  7. 3个5相乘列乘法算式_新人教版四年级数学上册4.2因数中间或末尾有0的乘法精讲...
  8. 如何利用markdown做出漂亮的笔记
  9. 停车场编码C语言,停车场系统部分C语言代码
  10. Altium Designer使用技巧之相同模块复用