补码的用途

     负数在内存中是以其绝对值的反码+1,并带上符号位存储。
     根据存储内容获取原值的过程即为反运算过程,如下:

     1.除符号位外,其他位减1;
     2.把1的结果按位取反
     3.再把2的结果带上符号位即该负数的实际数值
     求1111 1111 1111 1111 1111 1111 1111 0110的值实际表示
        111 1111 1111 1111 1111 1111 1111 0110   减   000 0000 0000 0000 0000 0000 0000 0001
     -------------------------
        111 1111 1111 1111 1111 1111 1111 0101
     -------------------------
按位取反 000 0000 0000 0000 0000 0000 0000 1010
     - ------------------------
      1 000 0000 0000 0000 0000 0000 0000 1010
     -------------------------
  结果                                     -10

数值有正负之分,计算机就用一个数的最高位存放符号(0为正,1为负).这就是机器数的原码了.假设机器能处理的位数为8.即字长为1byte,原码能表示数值的范围为 

(-127~-0 +0~127)共256个. 

有了数值的表示方法就可以对数进行算术运算.但是很快就发现用带符号位的原码进行乘除运算时结果正确,而在加减运算的时候就出现了问题,如下: 假设字长为8bits 

( 1 ) 10- ( 1 )10 = ( 1 )10 + ( -1 )10 = ( 0 )10 

(00000001)原 + (10000001)原 = (10000010)原 = ( -2 ) 显然不正确. 

因为在两个整数的加法运算中是没有问题的,于是就发现问题出现在带符号位的负数身上,对除符号位外的其余各位逐位取反就产生了反码.反码的取值空间和原码相同且一一对应. 下面是反码的减法运算: 

( 1 )10 - ( 1 ) 10= ( 1 ) 10+ ( -1 ) 10= ( 0 )10 

(00000001) 反+ (11111110)反 = (11111111)反 = ( -0 ) 有问题. 

( 1 )10 - ( 2)10 = ( 1 )10 + ( -2 )10 = ( -1 )10 

(00000001) 反+ (11111101)反 = (11111110)反 = ( -1 ) 正确 

问题出现在(+0)和(-0)上,在人们的计算概念中零是没有正负之分的.

于是就引入了补码概念. 负数的补码就是对反码加一,而正数不变,正数的原码反码补码是一样的.在补码中用(-128)代替了(-0),所以补码的表示范围为: 

(-128~0~127)共256个. 

注意:(-128)没有相对应的原码和反码, (-128) = (10000000) 补码的加减运算如下: 

( 1 ) 10- ( 1 ) 10= ( 1 )10 + ( -1 )10 = ( 0 )10 

(00000001)补 + (11111111)补 = (00000000)补 = ( 0 ) 正确 

( 1 ) 10- ( 2) 10= ( 1 )10 + ( -2 )10 = ( -1 )10 

(00000001) 补+ (11111110) 补= (11111111)补 = ( -1 ) 正确 

所以补码的设计目的是: 

⑴使符号位能与有效值部分一起参加运算,从而简化运算规则. 

⑵使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计 
时间: 2024-08-17 13:15:33

补码的用途的相关文章

什么是Complement(补码)?

大学上过计算机原理课程的朋友都接触过补码这个概念,不过当时书上所教授的内容都是以二进制作为前提,即所谓的2的补码(2's Complement).近来看TCP/IP Volume 1时,又接触到"1的补码"这个概念,忽然发现其实还不太明白补码到底是什么意思,故查阅资料记录之. 资料来源:维基百科 术语解释:Radix -- 基数,在本篇文章的范畴内等价于"进制" 定义:给出长度为n的数值y,则y的以基数b的补码为: bn - y   (即 b的补码) 水平有限,翻译

[科普]原码,反码,补码由来

今天看到原码,反码和补码,突然发现还是有点云里雾里,就重新复习了一下. 在计算机内部,所有信息都是用二进制数串的形式表示的整数.是整数就有正负之分,而这个正负也需要用二进制来表示,所以一般会用最高有效位作为符号位,0表示正号.1表示负号.这种正负号数字化的机内表示形式就称为"机器数",而相应的机器外部用正负号表示的数称为"真值",将一个真值表示成二进制字串的机器数的过程就称为编码. 带符号整数有原码.反码.补码.移码等几种编码方式: 1)        原码的特点就

8086CPU各寄存器的用途

8086 有14个16位寄存器,这14个寄存器按其用途可分为(1)通用寄存器.(2)指令指针.(3)标志寄存器和(4)段寄存器等4类. 1.通用寄存器有8个, 又可以分成2组,一组是数据寄存器(4个),另一组是指针寄存器及变址寄存器(4个). 数据寄存器分为:AH&AL=AX(accumulator):累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传送数据.BH&BL=BX(base):基址寄存器,常用于地址索引:CH&C

Java位运算总结:位运算用途广泛《转》

前天几天研究了下JDK的Collection接口,本来准备接着研究Map接口,可是一查看HashMap类源码傻眼咯,到处是位运算实现,所以我觉得还是有必要先补补位运算知识,不然代码看起来有点费力.今天系统研究了下,现记录如下. 首先要明白一个概念,Java位运算是针对于整型数据类型的二进制进行的移位操作.主要包括位与.位或.位非,有符号左移.有符号右移,无符号右移等等.需要注意一点的是,不存在无符号左移<<<运算符.根据位运算的概念规定,我们首先需要弄明白两个问题,java有哪些数据类型

Java Integer 进制转化的实现(附源码),对模与补码的理解

1.toBinaryString方法的实现 1 public static String toBinaryString(int i) { 2 return toUnsignedString0(i, 1); 3 } 4 private static String toUnsignedString0(int val, int shift) { 5 // assert shift > 0 && shift <=5 : "Illegal shift value";

2进制,10进制,16进制,补码和移位

逢二进一,逢十进一,十六进制 10110101(2) = 128+32+16+4+1 = 181(10) b 5(16) = b*16+5 = 11*16+5 = 181(10) 2进制 int n = 45; System.out.println(Integer.toBinaryString(n)); 计算机的内部(Java)只有2进制数据, 在显示的时候编程语言提供API将2进制转换为10进制显示出来. 计算机只能处理2进制数据, 利用编程语言提供的算法支持了10进制 Java中用于支持2进

原码、反码、补码

原码.反码.补码,计算机中负数的表示 1.表示范围 拿单字节整数来说,无符号型,其表示范围是[0,255],总共表示了256个数据.有符号型,其表示范围是[-128,127]. 先看无符号,0表示为0000 0000,255表示为1111 1111,刚好满足了要求,可以表示256个数据. 再看有符号的,若是用原码表示,0表示为0000 000.因为咱们有符号,所以应该也有个负0(虽然它还是0):1000 0000. 那我们看看这样还能够满足我们的要求,表示256个数据么? 正数,没问题,127是

JQuery的用途和功能

jQuery库为Web脚本编程提供了通用的抽象层,使得它几乎适用于任何编程的情形.由天它容易扩展而且不断有新插件面世增强它的功能,所以这里无法涵盖它所有可能的用途和功能.抛开这些就其核心特性而言,jQuery能够满足下列需求:    一.取得页面中的元素. 如果不使用JavaScript库,遍历DOM树,以及查找HTML文档结构中某个特殊的部分,必需编写很多代码.jQuery为准确获取需要操纵的文档元素,提供了可靠而富有效率的选择符机制.    二.修改页面的外观. CSS虽然为呈现方式提供了一

解读Mirantis Fuel部署OpenStack各个网络的用途和分析

首先得说一声不好意思,之前的环境破坏了,一直没有机器进行测试,所以之前的文章到第三篇就结束了一直没找到时间和环境继续测试,这里就简单说说Fuel的网络. 部署OpenStack最复杂的应该算是网络部分了,Fuel简化部署OpenStack的同时网络类型对于新手来说也是费解,接下来我简单说一下我的理解. 下图是我们使用Fuel部署的时候遇到的几个网络类型,此时使用neutron vlan模式部署. 我们总结下,大致是五个网络: 1.PXE(部署网络):这是部署网络,也就是在节点开机的时候设置的网络