今天主要介绍原码、反码与补码的知识。了解原码、反码与补码的知识,可以帮助我们更好地理解在计算机内部是如何进行运算的,同时对于后面更好地学习和理解Java基本数据类型及其范围打下基础。

背景知识:

在计算机中,最小的单位是位,也称为比特(bit)。而另一个常用单位是字节,一个字节是8位,也就是8比特。因为这个属性,本文介绍的原码、反码与补码的运算,也基于长度为8位来进行介绍

一、原码

原码,简单理解就是一种比较大家能比较熟悉的一种二进制表示形式。但是不同的是,为了区别正数和负数,将二进制中的最高位作为符号位,如果是0表示正数,如果是1表示负数。比如:

0000 1000    //表示为+8

1000 1000    //表示为-8

二、反码

上面我们介绍了什么是原码,原码的存在解决了一个基本的问题,那就是正数与负数区别表示的问题。这样看似完美,实则存在两个漏洞:

【☒漏洞一】:对于正数与负数的计算会出现错误

比如,计算 1 + (-1),正常结果应该为0,但是用原码计算会出现什么结果呢?如下图所示:

1      0000 0001

+

-1     1000 0001

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

-2     1000 0010

可见,因为原码中,正数与负数进行运算会产生错误。正是因为这个漏洞,诞生了反码。原码转反码的规则为:正数的反码为其本身,负数的反码是符号位不变,其他位取反。取反的规则就是如果是0就变成1,如果是1就变成0。这样,我们再来看下 1 + (-1)的计算:

       原码                反码

1      0000 0001        0 000 0001

+

-1     1000 0001        1 111 1110

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

       1000 0010        1 111 1111  

看到上面的结果,你也许还是会觉得奇怪,得到的结果是11111111,这看着也不是0啊,别急,这里的11111111是反码,反码是不能直接转成十进制得到结果的,应该转成原码再进行计算。

1 111 1111(反)  -----> 1 000 0000(原)-----> -0(十进制)

结果为负0,负0也就是0,结果正确。漏洞一完美解决~

三、补码

从上面的结果,我们看到,我们利用反码完美的解决了原码带来的漏洞一。接着我们来看漏洞二。

【☒漏洞二】:0重复的问题

原码与反码都存在一个问题,那就是0有两种表示形式,分别为0000 0000和1000 0000,也就是正0与负0。这使得原本八位数能表示2的8次方即256个数字,使用原码与反码却只能表示255个。对于程序员来说,这已经是极大的浪费了。所以必须要解决。而解决的办法也就是使用一种新的表现形式,即补码。

原码转补码的规则:正数的补码就是其本身,负数的补码是符号位不变,其余位数取反(即变成反码)再加1。举例如下:

正1 --> 0000 0001(原) --> 0000 0001(反) --> 0000 0001(补)

负1 --> 1000 0001(原) --> 1111  1110(反) ---> 1111 1111(补)

从上面的例子可以看出,使用补码进行正数与负数的计算是没有问题的。大家可以计算一下。同样在补码中,规定了0的表示为0000 0000,而1000 0000表示的为-128。这里需要注意的是对于-128,可以简单的认为是一种规定,它不能转换成反码和原码。

至此两个漏洞都已经解决。相应的,我们也介绍完了原码、反码与补码。

【总结与注意事项】

  1. 反码与补码不能直接使用二进制转十进制的规则,转成对应的十进制得到对应的大小,应该先转成原码后才可以。也就是说原码才是直接与大小进行关联的一种表现形式

  2. 在计算机系统中,数值一律用补码的形式进行表示与存储

  3. 需要比较熟悉相互的转换规则:

    1. 正数的原码、反码与补码都是一样的

    2. 负数原转反:符号位不变,其余位取反

    3. 负数原转补:符号位不变,其余位取反后加一

    4. 负数补转反:符号位不变,其余位减一

    5. 负数补转原:符号位不变,其余位减一后取反

原码、反码与补码的内容比较重要,原码相对比较直观,反码与补码的操作最好在纸上进行演练,这样印象更加深刻。

Java学习之计算机基础(二)的更多相关文章

  1. Java学习之计算机基础(一)

    阅读本文大概需要 4 分钟 想要开始学习Java开发,需要掌握一些必要的计算机基础.如果你是计算机专业的人或者已经学过类似的课程,可以跳过这篇文章的阅读.计算机基础课程有很多,小编在大学里学过的课程就 ...

  2. Java学习1——计算机基础知识

    本文包含了一些计算机基础知识:计算机组成:Windows常用快捷键:DOS常用命令:计算机语言发展史.

  3. Java学习 · 初识 面向对象基础二

    Package 为什么需要使用package a)   解决类重名的问题 b)   便于管理类 怎么使用package a)   类的第一句非注释性语句 b)   命名:域名倒着写,再加上模块名 注意 ...

  4. Java学习笔记之---基础语法

    Java学习笔记之---基础语法 一. Java中的命名规范 (一)包名 由多个单词组成时,所有字母小写(例如:onetwo) (二)类名和接口 由多个单词组成时,所有单词首字母大写(例如:OneTw ...

  5. [Java 教程 00] 计算机基础

    前言 我想,来到这的朋友肯定是想学习JAVA或者想要进入IT这个行业的.考虑到大家的基础可能不一样,有些人可能还是用着新买的电脑,为了让大家在后续的学习中更加顺畅.在学习一门全新的计算机语言之前,我需 ...

  6. Python学习 之 计算机基础

    第一章 计算机基础 1.1 硬件 计算机基本的硬件由:CPU / 内存 / 主板 / 硬盘 / 网卡 / 显卡 等组成,只有硬件但硬件之间无法进行交流和通信 1.2 操作系统 操作系统用于协同或控制硬 ...

  7. Java学习之旅基础知识篇:数据类型及流程控制

    经过开篇对Java运行机制及相关环境搭建,本篇主要讨论Java程序开发的基础知识点,我简单的梳理一下.在讲解数据类型之前,我顺便提及一下Java注释:单行注释.多行注释以及文档注释,这里重点强调文档注 ...

  8. java学习笔记之基础篇

    java选择语句之switch   //switch可以用于等值判断 switch (e) //int ,或则可以自动转化成int 的类型,(byte char short)枚举jdk 7中可以防止字 ...

  9. Python学习之计算机基础

    计算机基础: (1)计算机俗称电脑,是现代用于高速计算的电子计算器,可以进行数值计算也可以进行逻辑计算,还有存储记忆功能.是能够按照程序运行,自动,高速处理海量数据的现代化智能 电子设备. (2)物理 ...

随机推荐

  1. 紧跟腾讯大王卡:B站2233卡“基友号”即将上线

    来自B站官方的消息显示,B站在近期也将推出"基友号"功能,功能的内容是通话免费,考虑到这类互联网套餐都是中国联通在运营,因此在内容上可能也会效仿腾讯大王卡实现免费通话. 目前,B站 ...

  2. TIDB 参数解释

    地址:https://github.com/pingcap/docs-cn/blob/master/op-guide/configuration.md#tidb TiDB --store 用来指定 T ...

  3. 五种js判断是否为整数(转)

    五种js判断是否为整数类型方式 作者:snandy 这篇文章主要介绍了五种JavaScript判断是否为整数类型方式,需要的朋友可以参考下   这篇看看如何判断为整数类型(Integer),JavaS ...

  4. AngularJS学习篇(十六)

    AngularJS 表单 HTML 控件 以下 HTML input 元素被称为 HTML 控件: input 元素 select 元素 button 元素 textarea 元素 HTML 表单 H ...

  5. 一脚踏进Memcached的大门

    Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached ...

  6. [Bayesian] “我是bayesian我怕谁”系列 - Gaussian Process

    科班出身,贝叶斯护体,正本清源,故拿”九阳神功“自比,而非邪气十足的”九阴真经“: 现在看来,此前的八层功力都为这第九层作基础: 本系列第九篇,助/祝你早日hold住神功第九重,加入血统纯正的人工智能 ...

  7. 虚拟机通信配置与Xshell连接

    本文主要讲解虚拟机通信配置的详细步骤和Xshell工具连接,以及如何诊断网络问题并进行相应配置的问题. 1. 虚拟机通信配置 虚拟机通信配置的基本流程如图所示: 首先,我们先打开新建的虚拟机,然后输入 ...

  8. 六:Dubbo与Zookeeper、SpringMvc整合和使用

    DUBBO与ZOOKEEPER.SPRINGMVC整合和使用 互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架 ...

  9. Servlet编程实例1

    编程目的:使用JSP+servlet,来实现一个登陆页面,登陆成功则提示成功,登陆失败则提示失败. 编程要求:登陆页面由login.jsp负责显示,登陆成功由success.jsp负责显示,登陆失败由 ...

  10. SSH框架基础

    首先,SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层Web应用程序. 集成SSH框 ...