码迷,mamicode.com
首页 > 其他好文 > 详细

原码,反码,补码

时间:2016-10-08 19:33:48      阅读:98      评论:0      收藏:0      [点我收藏+]

标签:

首先看一个例子:

二进制转为十进制

二进制数: 0110 0100(原码)    最左边是符号位,0带包+, 1代表-

换算成十进制: 最右边是第0位,符号位也要计算

第0位 : 0 * 2^0 = 0

......                       

第7位 : 0 * 2^7 =  0        +

-----------------------------------------------------

100

原码,反码,补码如何计算

反码的表示方式:  正数的反码是其本身, 负数的反码是在其原码的基础上, 符号位不变,其余各个位取反

+1] = [00000001]原 = [00000001]反

[-1] = [10000001]原 = [11111110]反

补码的表示方法:  正数的补码就是其本身 ,负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

[+1] = [00000001]原 = [00000001]反 = [00000001]补

[-1] = [10000001]原 = [11111110]反 = [11111111]补

从补码推出原码,需要复习一下二进制减法运算: 借1当2

技术分享

基础概念

原码, 反码, 补码是机器存储一个具体数字的编码方式

机器数: [00000001]原码,用最高位0表示正、1表示负, 这种正负号数字化的表示形式就称为“机器数”

真值:[00000001]原码,可以转化为一个具体的数字,这个数字称为真值

编码:将一个真值表示成二进制字串的机器数的过程就称为编码。

为什么要有原码, 反码, 补码

计算机可以有三种编码方式表示一个数,原码才是被人脑直接识别并用于计算表示方式,但是在计算机系统中,数值一律用补码来表示(存储)

为了使计算机运算的更简单,机器可以只有加法,而没有减法

原码计算:

例如: 0 =  1 - 1 = 1 + (-1) = [00000001]原 (1) + [10000001]原(-1) = [10000010]原 = -2      结果显然是不对的 

为什么要用反码呢?

为了解决原码做减法的问题, 出现了反码:

反码计算:

1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0  

真值部分是正确的,但是会有[0000 0000]原和[1000 0000]原两个编码表示0,因为+0和-0是一样的

为什么要用补码呢?

解决了0的符号以及两个编码的问题

补码计算:

1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补=[0000 0000]原 = 0

这样,不会出现用补码计算时值为-0

8位二进制的最小值问题:

补码表示最小值:

(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1000 0000]补 = -128

但是

-128 =  [1000 0000]补 = [0111 1111]反 = [0000 0000]原 = 0 = [1000 0000] = -0   显然是错误的

得出结论: -128 并没有原码和反码表示

因此,使用补码, 不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数,这就是为什么8位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127].

 

 

 

  

 

原码,反码,补码

标签:

原文地址:http://www.cnblogs.com/liuconglin/p/5939377.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!