`
gwh_08
  • 浏览: 335332 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

原码、反码、补码与十六进制,八进制

    博客分类:
  • java
 
阅读更多

进行算法计算时,常常用到byte类型与十六进制之间的转化,一涉及到负数有时就犯迷糊,先整理记录下来。

1.首先,任何一个数或符号在计算机中,都是以二进制的形式存储的。

一个数在计算机中的二进制表示形式,  叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.

比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。

那么,这里的 00000011 和 10000011 就是机器数(但-3在计算中的实际存储中,并不是以10000011的形式存在,详见3)。

因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。

例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1

2.下面谈一下十进制、八进制与十六进制。

而现实中我们所熟悉的十进制数,可能是先人还没发明计算机之前的计算方式吧(呵呵,扯远了)。后来有了计算机,单纯的使用二进制表示数,有时人闹反应出我们所熟悉的十进制数比较慢(反之,由十进制在人脑中隐射成二进制亦然),而实际情况中对于3位与8位的二进制经常出现,所以又有了8进制与16进制,而8进制的7正好对应二进制111,如下。

八进制          二进制真值
7                 111
77               111111
777             111111111

 

十六进制的f对应二进制的1111,转化很方便也很好反应,如下

十六进制            二进制真值
F                      1111     
FF                    11111111
FFF                  111111111111          

 而十进制与二进制却没有这个形式上的直观反应,如十进制中的9对应二进制的1001.99对应二进制的1100011没有什么直观规律可言。

所以在二进制的基础之上又发明了8进制与16进制。

(以上纯属个人臆想,只是为了自己理解方面,不可作为论断来看,权当一个小论述吧)

3.关于原码、补码、反码。

首先,在计算机中,正数是以原码的方式的存储并参与运算的,而负数则是以反码的方式存储并参与运算的。

原码:

原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:

    [+1]原 = 0000 0001
    [-1]原 = 1000 0001

 第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:

[1111 1111 , 0111 1111] 

 即[-127 , 127]

反码:

反码的表示方法是:

正数的反码是其本身

负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.

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

补码:

补码的表示方法是:

正数的补码就是其本身

负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

4.用补码表示负数的意义:(在此不讨论反码,本人认为反码是因补码而生的,只是一个中间概念)

方便计算运算:(在此仅以计算机的基本运算加减法运算为例)

正数之间的加法运算,可以根据二进制的运算法则直接相加求和。在此不再一一列举验证了,有兴趣的可以自己验证。

但是对于减法运算,我们知道减法运算在数学中,a+b等价于a+(-b),所以居此,二进制的减法可以由此根据加法运算法则加上其负数来进行减法运算。

在此:

若我们采用原码的方式计算,如下:

1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2 

 显然与实际不符。

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

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

虽然 结果的真值部分是正确的. 而唯一的问题其实就出现在"0"这个特殊的数值上. 虽然人们理解上+0和-0是一样的, 但是0带符号是没有任何意义的. 而且会有[0000 0000] 和[1000 0000] 两个编码表示0.

于是补码的出现, 解决了0的符号以及两个编码的问题:

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

 这样0用[0000 0000]表示, 而以前出现问题的-0则不存在了.而且可以用[1000 0000]表示-128:

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

 注意:我们上面说的是用[1000 0000]表示 -128,而不是说-128的补码是[1000 0000](即由[1000 0000]不可根据原码转换成补码逆推出气原码)。-128是没有原码的。

在此,引入补码的意义出来了:

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

因为机器使用补码, 所以对于编程中常用到的32位int类型, 可以表示范围是: [-2^31, 2^31-1] 因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值.

最后:

注意负数在计算中是以补码的形式存储并参与运算的!

参考资料:

http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html

 

分享到:
评论

相关推荐

    原码反码补码PPT学习教案.pptx

    原码反码补码PPT学习教案 原码反码补码是计算机系统中最基本的概念之一,了解原码反码补码的原理和应用对于计算机科学和技术的学习非常重要。本资源摘要信息将对原码反码补码的概念、特点和应用进行详细的介绍。 ...

    二进制 十进制 八进制 十六进制转化+原码 反码 补码

    二进制与其他进制间的转换** - **二进制转八进制**:整数部分每三位转换为一位八进制数,小数部分每三位转换为一位八进制数,不足三位则补0。 - **二进制转十六进制**:整数部分每四位转换为一位十六进制数,小数...

    二进制原码反码补码.docx

    二进制原码反码补码知识点总结 计算机内部采用的是二进制,只有两个数字用于表示数据,即 0 和 1,所以它的进制原则是满 2 进 1。十进制用的是 0、1、2、3……9 十个数字来表示数据,它的原则是满 10 进 1。 二...

    进制转换及原码反码补码练习题.doc

    本文档主要涵盖了进制转换及原码反码补码的相关知识点,包括二进制、八进制、十进制、十六进制之间的转换关系,原码、反码、补码的概念和计算方法,以及相关的练习题和解析。 一、进制转换 1.1、二进制转十进制 ...

    进制转换及原码反码补码.docx

    进制转换及原码反码补码 在计算机系统中,数字系统是基础部分,很多计算机科学家和程序员需要熟悉不同的数字系统和它们之间的转换。下面我们将详细介绍进制转换、原码、反码和补码的概念和应用。 一、进制数的表达...

    进制转换+原码反码补码参照.pdf

    进制转换和原码反码补码参照 根据提供的文件信息,本节将详细探讨进制转换和原码反码补码的相关知识点。 6.1 为什么需要八进制和十六进制? 在编程中,我们常用的还是十进制,因为C/C++是高级语言。但是,由于...

    二进制、八进制、十六进制转换.doc

    二进制与十六进制之间的转换,可以通过先将二进制转换为十进制,然后再转换为十六进制,或者直接按每四位二进制对应一位十六进制的方式进行。 6.5 原码、反码、补码 这是计算机中表示负数的一种方式,原码直接表示...

    数字的原码、反码和补码

    为了能方便地与二进制转换,就使用了十六进制(2^4)和八进制(2^3)。在计算机中,数值有正负之分,计算机就用一个数的最高位存放符号(0 为正,1 为负)。这就是机器数的原码了。 原码的表示范围为(-127~-0 +0~...

    c语言编程题:从键盘输入一个十进制数,将其转换为二进制、八进制和十六进制数,并同时输出。

    根据给定的文件信息,本篇文章将围绕C语言编程题展开,主要介绍如何从键盘接收一个十进制数,并将其转换成二进制、八进制以及十六进制数进行输出的方法。 ### 一、问题描述 题目要求通过C语言编程实现从键盘输入一...

    网管工具\教程 二进制 八进制 十六进制转换方式

    由于二进制和十六进制之间的直接对应关系,二进制与十六进制的转换相对简单。每四位二进制对应一位十六进制,反之亦然。例如,二进制数01100100转换为十六进制是64。 #### 原码、反码、补码 在计算机中,正数和...

    二进制,八进制,十六进制转换

    - **二进制与十六进制之间的转换**:可以先将二进制转换为十进制,再转换为十六进制,或者通过特定规则直接转换。例如,二进制的`1101`对应十六进制的`D`。 **6.5 原码、反码、补码** 原码是直接表示数值的二进制...

    二进制、八进制、十六进制转换方式

    由于每四位二进制位对应一位十六进制位,因此二进制数与十六进制数之间的转换非常直接。例如,二进制数1100100转换为十六进制数的过程如下: - 将二进制数分成四位一组:1100 | 1000 - 转换成十六进制位:1100 → C...

    二进制、八进制、十六进制转换

    在计算机科学中,二进制、八进制和十六进制是三种常用的不同数制,它们主要用于表示和处理数据。二进制系统是最基础的,因为它与计算机内部的电子开关状态(0 和 1)直接对应。而八进制和十六进制则是为了简化二进制...

    二进制八进制十六进制

    二进制、八进制和十六进制是计算机系统中最常用的进制,它们与十进制(我们日常生活中的计数方式)有着密切的关系。以下是这些进制转换的具体讲解: **6.1 为什么需要八进制和十六进制?** 主要原因是二进制虽然在...

    二进制、八进制、十六进制转换方式(精灵工作室强烈推荐).pdf

    6.2.5 十六进制数转换成十进制数十六进制数转换为十进制数的原理与八进制类似,只是基数变成了16,包括数字0-9和字母A-F(A代表10,B代表11,...,F代表15)。例如,十六进制数`ABCD`转换为十进制数,可以按照每个位...

    二进制、八进制、十六进制转换方式.pdf

    5. **二进制与十六进制的互相转换**: - 二进制转换为十六进制,可以每4位二进制合并成一位十六进制,因为16是2的4次方。例如,二进制数11001011可以转换为十六进制CB。 - 十六进制转换为二进制,则是将每个十六...

    二进制、八进制、十六进制转换方式 (2).pdf

    6.5章节提到了原码、反码和补码,这些都是计算机中表示负数的方式,原码直接表示符号位,反码是除了符号位外的所有位取反,补码则是反码加1,用于避免在计算机中进行减法运算时出现溢出问题。 6.6章节提及通过调试...

    [十进制小数转换二进制]二进制、八进制、十六进制转换方式_0.pdf

    然而,人类通常使用十进制进行日常计算,因此理解和转换二进制、八进制和十六进制对于程序员来说是基础技能。 6.1 为什么需要八进制和十六进制? 在编程时,尽管十进制更为直观,但二进制、八进制和十六进制各有其...

    二进制、八进制、十六进制转换方式 (2).docx

    八进制和十六进制作为二进制的便捷表示,是因为它们是2的幂次方(8是2的3次方,16是2的4次方),这使得它们与二进制之间转换非常直接。例如,一个八进制数或十六进制数的每一位对应于若干位的二进制数,简化了转换...

    原码补码反码练习题PPT课件.pptx

    例如,二进制可以转换为八进制、十六进制等,反之亦然。了解不同数制之间的关系对于计算机科学的学习和应用非常重要。 6. 数制转换的应用 数制转换有很多实际应用。例如,在计算机网络中,数据需要从一种数制转换...

Global site tag (gtag.js) - Google Analytics