首页 > 其他分享 >【见闻录】聊聊补码

【见闻录】聊聊补码

时间:2022-09-01 22:23:02浏览次数:83  
标签:0000 二进制 补码 整数 负数 见闻录 聊聊 原码

前言

聊补码的前因是由于昨晚做某W的笔试时碰到了一道题,给我干不会了:

十进制的-6.6875,转化为二进制补码是___________;(1位符号位,4位整数位,4位小数位)
点击查看答案
1.10010101

不会的同学就坐下看看吧;会的同学也可以看看,能否从我的理解里学到些什么。

正文

1. 为什么发明补码

简言之,是为了方便计算机对负数进行处理。不了解的可以去看看这篇文章

2. 补码的计算方法

2.1 十进制整数求得二进制补码

判断该数的正负性:若为正,则该数的二进制原码就是二进制补码若为负,则将该数的二进制原码的所有数据位(不包括符号位)取反后在最低位+1

2.2 十进制纯小数求得二进制补码

同2.1。

2.3 十进制整数+小数求得二进制补码

同2.1。
但我要提出一个问题:为什么不能把整数和纯小数分开算,算完再合在一起呢?前言中那道题不是将整数位4位和小数位4位分得很清楚吗?

3. 补码的本质

要想解答2.3的这个问题,首先得先了解补码的本质到底是什么,即为什么补码的计算方式是如2.中所说的那样
其实如果认真看了1.的朋友估计已经能理解一些了。补码(2's complement),正常中译过来应该叫"2的补"。
假设一个负数的二进制原码为x,数据位个数为k,那么补码的定义是:
-x = 2^k - x
因为对于计算机来说,要求就是时间复杂度和空间复杂度越低越好。而补码可以说是二进制表示负数的方法中最简洁的方法,因为它可以将+/-运算都看成+,不需要判断也不需要多封装一个减法器;而且节省出了-0的位置,能够多表示一位负数(如8位数中的-128)。

讲完真正的定义,接着来看二进制减法是如何做的:

假设一个负数x的8位二进制原码(4位整数位,4位小数位,没有包含符号位)为:10110110,那么接下来我
们用2^8 - x:
  1 0000 0000
— 0 1011 0110
———————————
  ? ???? ????
我们会发现上式中需要借位,也就是
1 0000 0000 = 1111 1111 + 0000 0001
那么上式变为:
  0 1111 1111 + 0 0000 0001
— 0 1011 0110
———————————
  ? ???? ???? + 0 0000 0001
1 - 1 = 0 , 1 - 0 = 1;我们发现,其实所谓的取反,就是拿一个相同位数并且全1的二进制数减去我们的原码x,而取反后加1,其实是最低位借位之后剩下的,要补上。

那么现在就知道为什么不能拿整数+小数分开算了,因为分开算补码之后再合并到一起就相当于:
  1 0001 0000
— 0 1011 0110
———————————
  ? ???? ????
这会导致二进制补码存在+1偏置,当变量x在[-1,0)的范围内时,算出来的补码会与某个其他变量算出来的补码一致,导致多个值对应一个二进制补码的问题

标签:0000,二进制,补码,整数,负数,见闻录,聊聊,原码
From: https://www.cnblogs.com/harden-shen/p/16647220.html

相关文章

  • 聊聊Garbage Collector的SATB
    序本主要研究一下GarbageCollector的SATBCMS、G1、Shenandoah在进行concurrentmarking的都采用了SATB的技术ShenandoahShenandoah面向low-pause......
  • move和forward为什么使用方式不同(聊聊forward为什么不让右值以左值的形式转出)
    https://blog.csdn.net/qq_40132943/article/details/122790084......
  • 聊聊数据库建表的15个小技巧
    前言对于后端开发同学来说,访问数据库,是代码中必不可少的一个环节。系统中收集到用户的核心数据,为了安全性,我们一般会存储到数据库,比如:mysql,oracle等。后端开发的日常工......
  • 来聊聊 OpenJDK 和 JVM 虚拟机
    自从Oracle收购Sun以后,Java世界也变了不少。好在Oracle还开源了个OpenJDK,并且很多东西都变了。OpenJDK就是一个桶,什么都可以往里面装,各大公司又纷纷推出自己的......
  • 聊聊项目中分表的实际应用-2022新项目
    一、业务场景Web项目开发中,分表是时常会使用到的方式。分表的一个目的是为了缓解单表数据量过大,导致操作时性能下降的问题。可是在实际开发中应该如何进行进行分表呢......
  • 聊聊ThreadLocal的使用
    1.什么是ThreadLocalThreadLocal的作用是提供线程内的局部变量,在多线程环境下访问时能保证各个线程内的ThreadLocal变量各自独立。也就是说,每个线程的ThreadLocal变量......
  • 聊聊@SpringBootApplication注解
    @SpringBootApplication其实就是以下三个注解的总和@Configuration: 用于定义一个配置类@EnableAutoConfiguration :SpringBoot会自动根据你jar包的依赖来自动配置项......
  • 【Java基础】二进制的三种形式:原码、反码、补码
    1.二进制的三种形式原码:数值的二进制,最高位是符号位负数的反码:对原码按位取反,最高位确定为1负数的补码:反码+1计算机以二进制补码的形式保存所有的整数正数的原码、反......
  • DevOps落地实践点滴和踩坑记录-(2) -聊聊平台建设
    很久没有写文章记录了,上一篇文章像流水账一样,把所见所闻一个个记录下来。这次专门聊聊DevOps平台的建设吧,有些新的体会和思考,希望给正在做这个事情的同学们一些启发吧。De......
  • 前端监控系列2 |聊聊 JS 错误监控那些事儿
    作者:彭莉,火山引擎APM研发工程师。2020年加入字节,负责前端监控SDK的开发维护、平台数据消费的探索和落地。有必要针对JS错误做监控吗?我们可以先假设不对JS错误......