二进制的减法

二进制的减法注:正数的补码是其自身负数的补码是其反码+1这里需要说明的是,在计算机中做二进制数运算时,一定要明确是在多少位的整型前提下进行的,这样才能够正确处理位数溢出的问题。其实减法也可以看成加法6+(-4)无论加减法总结:补码相加结果再求补码1表示负0表示正在计算机中,负数是使用它的补码来表示的。所谓补码,就是反码+1。所谓反码,就是二进制数逐位取反。所谓逐位取反,就是1变成0,0变成1。例如:原来的二进制数:1011011101101反码:01001000100..

大家好,又见面了,我是你们的朋友全栈君。

注:正数的补码是其自身 负数的补码 是其反码+1

这里需要说明的是,在计算机中做二进制数运算时,一定要明确是在多少位的整型前提下进行的,这样才能够正确处理位数溢出的问题。

其实减法也可以看成加法 6+(-4)

 

无论加减法总结:补码相加 结果再求补码

1表示负

0表示正

 

在计算机中,负数是使用它的补码来表示的。所谓补码,就是反码+1。所谓反码,就是二进制数逐位取反。所谓逐位取反,就是1变成0,0变成1。例如:

原来的二进制数: 1011011101101反码: 0100100010010补码: 0100100010011

 

在数学里面,当我们判断一个正数和负数的时候,是通过这个数字前面的负号来判断的,例如: 5和 -5。但是由于计算机里面只有0和1,如何表示负号呢?因此可以使用一个额外的1来表示。例如:

正数: 0101负数: 1101

其中最左边的0和1表示的是符号位,0为正数,1为负数。

如果到这里,你以为你看懂了,那么我问你一个问题,下面几个数有什么区别:

0101

00101

000101

0000101

00000101

下面几个数有什么区别:

1101

10101

100101

1000101

10000101

实际上,他们表示的是不同位数条件下的同一个数。因为在计算机中,你定义一个数字的时候,是需要先提前指定这个数的类型的。例如int型、long型等等。(即便你用的Python,不需要人工指定,但是在底层它也会自动指定)。所以,如果我直接说:数字5在计算机中是怎么储存的,是没有意义的。应该说,数字5在8位整型下面是怎么储存的、在32位整型下面是怎么储存的:

00000101 # 8位整型

00000000000000000000000000000101 # 32位整型

所以,对于-5,在8位整型和32位整型下面,他们是这样储存的:

10000101 # 8位整型

10000000000000000000000000000101 # 32位整型

在计算机中,一个正数的补码就是它自身,例如 00000101的补码还是 00000101,而负数的补码,就需要根据补码的规则进行计算,例如在8位整型下,-5的补码运算规则如下:

1.首先计算正5的二进制数:00000101

2.逐位取反:11111010

3.加1:1111011

 

接下来,例如我们在8位整型下,计算9-5的值,那么在计算机中,运算过程为:

1.求9的二进制补码(正数的补码就是它自身):00001001

2.求5的二进制补码:11111011

3.两个补码相加:100000100

4.由于我们是在8位整型的环境下,所以最左边这个1被直接丢掉了(溢出),结果变成:00000100

5.对结果再求补码。由于结果00000100最左边是0,表示正数,所以补码是自身。因此二进制数00000100对应的十进制数为4,就是正确结果。

 

再来看看8位整型条件下:10 – 13 = -3的过程:

1.计算10的二进制数补码:00001010

2.-13的二进制补码:11110011

3.两个补码相加:11111101

4.对结果求补码,由于最左边这一位是1,表示负数,所以要把十进制负数转二进制补码的过程反过来

5.先转成十进制正数对应的二进制数:00000011为3

6.把负号加上:-3,答案正确

 

这里需要说明的是,在计算机中做二进制数运算时,一定要明确是在多少位的整型前提下进行的,这样才能够正确处理位数溢出的问题。

由于位数溢出,在计算机中才会出现两个正数相加,结果却是负数的情况。例如:

127 + 1,在数学上结果为128,但是在计算机中,8位整型的情况下,结果为-128。原因如下:

1.计算127对应的二进制补码:01111111

2.计算1对应的二进制补码:00000001

3.两个补码相加:10000000

4.由于结果的最左侧为1,表示负数,因此要把十进制负数转二进制补码的过程反过来

5.先转成十进制正数对应的二进制补码:10000000(没错,10000000的补码恰好还是10000000)也就是128

6.加上负号:-128

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

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

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


相关推荐

  • ODrive应用 #6 编码器

    编码器支持的编码器请首先阅读一下ODrive编码器选型指南。编码器校准ODrive支持的所有编码器类型都需要进行某种编码器校准。这需要以下条件:选择一种编码器并将其安装到电动机选择编码器通讯接口(e.g.,AB,ABIorSPI)将编码器通信接口连接到ODrive加载正确的odrive固件(默认的固件大多数情况下都是可以的)电机校准将设置保存在ODrive中,并正…

    2022年4月8日
    192
  • 新浪云SAE使用入门,教你如何发布自己的网站[通俗易懂]

    新浪云SAE使用入门,教你如何发布自己的网站[通俗易懂]新浪云sae是一个免费的web服务器,SAE的Web服务器采用分布式部署的方式,开发者将代码部署到SAE前端机后,会通过同步的方式,将代码部署到SAE所有的Web服务器。相当于在每一台Web服务器上都

    2022年8月3日
    3
  • mysql set 变量_hive声明变量

    mysql set 变量_hive声明变量1.类型声明set不需要声明类型,declare必须指定类型2.位置set位置可以任意,declare必须在复合语句的开头,在任何其它语句之前3.作用范围DECLARE定义的变量的作用范围是BEGIN…END块内,只能在块中使用。SET定义的变量用户变量,作用范围是会话/全局  如SET@var=12的定义,则var的作用域为整

    2022年8月20日
    10
  • 一文讲透鱼眼相机畸变矫正,及目标检测项目应用 值得收藏

    1个人介绍大家好,我是潘大强。目前博士毕业4年,主要从事智能安防行业。之前也分享过AI从业的一些心得,个人介绍链接。应大白的邀请,从AI从业者的角度,分享工作中遇到的一些经验。之前在江大白的群里,看到有同学提问“鱼眼相机标定”的问题。对于鱼眼相机的标定和矫正,网上已经有很多理论文章,但是落实到代码层面的并不多,而且大部分代码都是C++实现。但是做AI的同学,大多数都是用python语言,所以本次分享,我用python语言(只依赖opencv-python包和numpy包)..

    2022年4月17日
    137
  • 解决kafka无法删除topic问题

    解决kafka无法删除topic问题1.问题描述使用kafka命令删除某个topic之后,查看集群的topic列表时,被删除的tpoic依然存在#/data/kafka/bin/kafka-topics.sh–delete–zookeeperzook_ip–topicsystemTopicsystemismarkedfordeletion.Note:Thiswillhavenoimpactifdelete.topic.enableisnotsettotrue.[外链图片转存失败,

    2022年10月16日
    0
  • 2.1pycharm 设置Python模块的搜索路径的方式「建议收藏」

    2.1pycharm 设置Python模块的搜索路径的方式「建议收藏」step1:打开pycharm—>目标文件夹—->右键——>new—–>directory—->创建名为modules文件夹。step2:选中modules文件夹—->右键——>new—->pythonfile—–>创建名为working.py文件,在working.py文件中定义函数hel…

    2022年8月28日
    0

发表回复

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

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