学习:原码-反码-补码

文章目录

前提知识

正数不需要进行原码反码补码一说,正数就是正数,我们原码反码补码是为了针对负数
(按道理来说其实根本不存在什么码,只有二进制机器码,不过是为了方便计算)

  • 原码

数值的二进制即为原码

  • 反码

将二进制位取反即可,即 0-->1, 1-->0

  • 补码

将原码取反码再加一即为补码

  • 移码

符号码+数值码 = 移码

这里的符号码和数值码在不同环境下又有不一样的叫法,暂且这个名字是最符号的

原码详解

原码是对应数值的二进制码

  • 整数原码

    • 定义
    • 理解:大于0就没什么好说了,小于0为什么是2^n^ - x ?
      比如:x = -0010 他的n=4,所以n表示的是二进制的位数,因此直接取n为2的阶可以比原二进制0010大一个位数,本质其实就是这个,用比该数值大一位的数字去进行减一个负数即加上这个数值,其实就是加一个符号位,即10000,又因为2^n^ - x ,这时候就能看懂了,其实是为了用x小于0这个特性,然后再减去负数即加一个正数,这样就是把2^n^次幂加进x这个负数中去了,实现了1作为符号位区分出一个负数。(那么整数也是同理只不过用0作为符号位有时候可以不写)
  • 小数原码

    • 定义

    理解:大于0也没什么好说的了,为什么小于0是用1-x?

    比如:-0.1101 比小数点高一位也就只有1了,而且永远是1,所以就是给负数加一个1符号位。

    举一反三:-1.1101,这时候我们这个是大于小数的,那么我们最高位应该是加在1的前面,

    即:1,1.1101,为了容易分辨,教材上都是用逗号对符号位区分,当然计算机中没有逗号,全部都是二进制,只是为了我们认为能分清。


上述解析纯纯原理,其实我们知道负数的原码在符号位上面是1来表示就行


反码

负数的反码符号位不参与反码,将数值位进行反码即可

  • 整数反码表示法:
  • 小数反码表示法:

补码

负数的符号不参与反码运算,对于两个负数的补码相加,如果溢出了,1会被丢弃掉。

  • 整数补码
    • 定义
    • 理解:n一样是表示二进制的位数,为什么要n+1呢?
      原因是后面我们是2^n+1^ + x,因为x是负数,那么我们在这里采用的是加法,所以其实是减去一个正数,如果只选择高一位减去正数的话我们最高位就会被借位借走变成0,我们负数就不成立了,所以我们需要n+1,这时候就肯定保证了减走一个二进制后还能留下最高位,因为我们选择的是高两位数。
  • 小数补码
    • 定义
    • 理解:其实学到这思考一下与原码定义和上面的整数补码定义就能想到了,我们无非就是用高一位或者高两位进行施法,那么在这里是补码,整数补码是用高两位,那么我们应该想到的是小数部分应该也是要用高两位进行借位留下最高位作为符号位,所以就是(因为x是负数):2 + x

二进制负数的运算

关于负数的二进制运算需要对负数取补码,然后补码之间进行运算,然而正数所有码都一样(不严格来说),所以只需要把负数取补码即可,然后就能正常的像正数一样运算了。

相关推荐
地球空间-技术小鱼15 分钟前
嵌入式系统学习
嵌入式硬件·学习
dengqingrui1236 小时前
【树形DP】AT_dp_p Independent Set 题解
c++·学习·算法·深度优先·图论·dp
我的心永远是冰冰哒6 小时前
ad.concat()学习
学习
ZZZ_O^O6 小时前
二分查找算法——寻找旋转排序数组中的最小值&点名
数据结构·c++·学习·算法·二叉树
slomay8 小时前
关于对比学习(简单整理
经验分享·深度学习·学习·机器学习
hengzhepa8 小时前
ElasticSearch备考 -- Async search
大数据·学习·elasticsearch·搜索引擎·es
小小洋洋10 小时前
BLE MESH学习1-基于沁恒CH582学习
学习
Ace'11 小时前
每日一题&&学习笔记
笔记·学习
IM_DALLA11 小时前
【Verilog学习日常】—牛客网刷题—Verilog进阶挑战—VL25
学习·fpga开发·verilog学习
丶Darling.11 小时前
LeetCode Hot100 | Day1 | 二叉树:二叉树的直径
数据结构·c++·学习·算法·leetcode·二叉树