计算机中为什么会用补码运算符号_负数求补码

计算机中为什么会用补码运算符号_负数求补码总所周知,计算机内部的所有数都是以二进制的形式存在的。而二进制在计算机里又有多种编码方式——原码、反码、补码等。而在这些编码方式里面用得最多的不是最简单、最直接的原码而是补码。这是为什么呢?想搞懂这个问题首先得明白什么是原码、反码以及补码,如果你对他们还不太了解,那就先看看我另一篇博客——原码、反码、补码其实很简单。如果你对他们已经很熟悉,那么我们继续往下看。A、B、C三种相似的东西,

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

总所周知,计算机内部的所有数都是以二进制的形式存在的。而二进制在计算机里又有多种编码方式——原码、反码、补码等。而在这些编码方式里面用得最多的不是最简单、最直接的原码而是补码。这是为什么呢?想搞懂这个问题首先得明白什么是原码、反码以及补码,如果你对他们还不太了解,那就先看看我另一篇博客——原码、反码、补码其实很简单。如果你对他们已经很熟悉,那么我们继续往下看。

A、B、C三种相似的东西,选C而不选A和B,那么C肯定具有其他两者所没有的优势。那么补码究竟有什么优势让他备受青睐呢?下面我们具体的分析一下:

原码:
原码的特点就是编码简单直观,与真值转换非常方便。既然原码这么好,那为什么不选他而选补码呢?接下来就是不选他的关键所在,虽然原码非常的简单直观,但是当用原码表示0的时候就会出问题。0用原码表示分为+0和-0,当机器字长为8时,

[+0]原=00000000,[-0]原=10000000。

这就有问题了,同一个数却有两种表示,产生了二义性,从而给机器判断0带来了麻烦;二是用原码运算时,符号位需要单独处理,而且运算规则很复杂。例如加法运算,若两个数异号,则先要让绝对值大的数减去绝对值小的数,然后把绝对值大的数的符号付给结果。还有就是,借位操作如果用计算机硬件实现起来是很困难的。正是因为原码有这些不足之处,才促使人们研究其他的编码方法。


反码:

反码很少会被用到,他主要的用途就是作为原码与补码的一个桥梁。他和原码一样对0有两种表示方法,

[+0]反=00000000,[-0]反=11111111。

不采用反码的原因跟原码差不多,就不赘述了。


补码:

说到补码,就不得不引人另一个概念——模数。模数从屋里意义上讲是某种计量器的容量。这里我们经常举的一个例子就是钟表,其模数为12,即每到12就重新从0开始,数学上叫取模或求余(mod),java、C#和C++里用%表示求余操作。例如:

14%12=2

如果此时的正确时间为6点,而你的手表指向的是8点,如何把表调准呢?有两种方法:一把表逆时针拨两个小时;二是把表顺时针拨10个小时,即

8-2=6

(8+10)%12=6

也就是说在此模数系统里面有

8-2=8+10

这是因为2跟10对模数12互为补数。因此有一下结论:在模数系统中,A-B或A+(-B)等价于A+[B补],即

8-2/8+(-2)=8+10

我们把10叫做-2在模12下的补码。这样用补码来表示负数就可以将加减法统一成加法来运算,简化了运算的复杂程度。

采用补码进行运算有两个好处,一个就是刚才所说的统一加减法;二就是可以让符号位作为数值直接参加运算,而最后仍然可以得到正确的结果符

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/192997.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java集合汇总篇「建议收藏」

    Java集合汇总篇「建议收藏」一.集合框架Java集合框架一些列的接口和类来实现很多常见的数据结构和算法,例如LinkedList就是集合框架提供的实现了双向链表的数据结构,关于这一篇文章建议大家收藏,我会不断地完善和扩充它的内容,例如最下面的系列文章我以后也会对它进行不断的更新集合框架的接口集合框架提供了很多接口,这些接口都包含了特定的方法来实现对集合上的特定操作)我们将要学习这些接口以及子接口和它们的各种实现类,在开始之前我们先简单学习一下这些广泛运用的接口,可以看到整个集合框架,总共有三个顶级接口Collecti

    2022年7月16日
    16
  • 给出前序遍历和中序遍历求二叉树_已知前序遍历和后序遍历

    给出前序遍历和中序遍历求二叉树_已知前序遍历和后序遍历一、基本概念1.先序遍历(NLR)可以确定二叉树的父子结点;2.中序遍历(LNR)可以确定二叉树的左右子树;3.后序遍历(LRN)可以确定二叉树的父子结点;二、结论1.已知先序遍历,中序遍历序列,能够创建出一棵唯一的二叉树,可以得出二叉树的后序遍历;2.已知后序遍历,中序遍历序列,能够创建出一棵唯一的二叉树,进而可以得出二叉树的先序序列;3.综上,必须含有中序遍历(确定…

    2025年10月18日
    4
  • DataGrip 2021.12.12 激活码【2021免费激活】

    (DataGrip 2021.12.12 激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html0BXA05X8YC-eyJsa…

    2022年3月30日
    50
  • Maven打包时引入本地jar包

    Maven打包时引入本地jar包背景开发的时用到的jar包可能在私服中找不到,需在下载到本地,然后在编译器Eclipse或者IDEA中引入本地jar包,这样在本地开发是OK的,但是linux服务器通过Maven打包的时候会提示异常找不到对应的类。这是需要在我们的pom.xml文件添加点配置了。落地开发支付宝沙箱支付时,需要引入本地jar包,我把jar存放的项目中的/src/main/resources/lib下1.打…

    2022年5月27日
    122
  • android测试面试题及答案_android面试题高频

    android测试面试题及答案_android面试题高频==

    2022年8月27日
    2
  • Linux系统的内核态和用户态[通俗易懂]

    Linux系统的内核态和用户态[通俗易懂]一、 Unix/Linux的体系架构  如上图所示,从宏观上来看,Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核)。内核从本质上看是一种软件——控制计算机的硬件资源,并提供上层应用程序运行的环境。用户态即上层应用程序的活动空间,应用程序的执行必须依托于内核提供的资源,包括CPU资源、存储资源、I/O资源等。为了使上层应用能够访问到这些资源,内核必须为上层应用提供

    2025年12月13日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号