原码、反码、补码、移码

原码、反码、补码、移码存在于有符号数中,有符号数的最高位是符号位,0 表示正数,1 表示负数,这些码统称为机器数。

在计算机中,一个二进制数由符号位和数值位组成,在 8 位计算机中,由于最高位是符号位,数值位最多也就 7 位。

ps:下面介绍的各种码,如没有特殊说明,都是 8

原码

原码是计算机用于表示的十进制数的方式。

在实际的生活中,表示正数是没有符号的,但是在计算机中,它不会脑补符号,所以为了方便讨论,我们把有符号的十进制数叫做真值,比如:+10-10

十进制数对应的原码:

  • 定点整数:数值位高位补 0

    • +10 的原码:00001100
    • -10 的原码:10001100
  • 定点小数:数值位低位补 0

    • +0.75 的原码:0.1100000
    • -0.75 的原码:1.1100000

十进制数中 +0-0 都是相同的,但在计算机中要区分符号位,所以 0 的原码有两种表示方式:

  • +000000000
  • -010000000

原码的表示范围:

  • 定点整数:-(2^(n-1) - 1) ~ 2^(n-1) - 1

    • -(2^7 - 1) ~ 2^7 - 1
    • -127 ~ 127
  • 定点小数:-(1 - 2^-(n-1)) ~ 1 - 2^-(n-1)

    • -(1 - 2^-7) ~ 1 - 2^-7
    • -0.9921875 ~ 0.9921875

反码

反码是原码转补码的一个中间状态,实际没啥用

  • 原码符号位是 0,反码等于原码
  • 原码符号位是 1,数值位全部取反

十进制数对应的反码:

  • 定点整数:

    • +10 的原码:00001100,反码:00001100
    • -10 的原码:10001100,反码:11110011
  • 定点小数:

    • +0.75 的原码:0.1100000,反码:0.1100000
    • -0.75 的原码:1.1100000,反码:1.0011111

反码的表示范围和原码一样:

  • 定点整数:-(2^(n-1) - 1) ~ 2^(n-1) - 1

    • -(2^7 - 1) ~ 2^7 - 1
    • -127 ~ 127
  • 定点小数:-(1 - 2^-(n-1)) ~ 1 - 2^-(n-1)

    • -(1 - 2^-7) ~ 1 - 2^-7
    • -0.9921875 ~ 0.9921875

0 的反码也有两种表示方式

  • +0 的原码:00000000,反码:00000000
  • -0 的原码:10000000,反码:11111111

补码

补码的作用是将二进制数减法运算转变成加法运算

  • 原码符号位是 0,补码等于原码
  • 原码符号位是 1,补码 = 原码的反码,末尾 + 1(要考虑进位)

十进制数对应的补码:

  • 定点整数:

    • +10 的原码:00001100,反码:00001100,补码:00001100
    • -10 的原码:10001100,反码:11110011,补码:11110100
  • 定点小数:

    • +0.75 的原码:0.1100000,反码:0.1100000,补码:0.1100000
    • -0.75 的原码:1.1100000,反码:1.0011111,补码:1.0100000

0 的补码只有一种形式:00000000。为什么原码和反码都有两种表示方式,但补码就一种了呢?

  • +0 的原码 = 反码 = 补码 = 00000000
  • -0 的原码 = 10000000,反码 = 11111111,补码 = 100000000-0 的补码有 9 位,而实际计算机才 8 位,最高位的 1 就会被舍弃,从而它的补码也是 00000000

补码表示的范围:

  • 定点整数:-(2^(n-1)) ~ 2^(n-1) - 1,比原码多表示位:2^(n-1)

    • -(2^7) ~ 2^7 - 1
    • -128 ~ 127
  • 定点小数:-1 ~ 1 - 2^-(n-1)

    • -1 ~ 1 - 2^-7
    • -1 ~ 0.9921875

负数补码转为原码,数值位取反,末尾 + 1

  • -10 的补码为 11110100

    • 取反:10001011,末尾 + 1 得到原码:10001100
  • -0.75 的补码为 1.0100000

    • 取反:1.1011111,末尾 + 1 得到原码:1.1100000

[x]补 -> [-x]补,连同符号位取反,末尾 + 1

  • -10 的补码为 11110100 -> 10 的补码是?

    • -10 的补码取反 00001011,末尾 + 100001100
  • 0.75 的补码为 0.1100000,-> -0.75 的补码是?

    • 0.75 的补码取反 1.0011111,末尾 + 11.0100000

移码

移码的作用是判断两个数的大小

  • 补码转移码:在补码的基础上将符号位取反
  • 移码转补码:在移码的基础上将符号位取反

为什么补码和移码之间的转换,只需要符号位取反就行了?

  • 移码 = 补码 - 偏置值(2^(n-1))

    • -10 的补码为 11110100,偏置值为 128 对应的二进制数为 10000000
    • 11110100 - 10000000 = 01110100
    • -10 的移码为 01110100
移码只能用于表示整数

十进制数对应的移码:

  • 定点整数:

    • +10 的补码:00001100,移码:10001100
    • -10 的补码:11110100,移码:01110100
  • 定点小数:

    • +0.75 的补码:0.1100000,移码:1.1100000
    • -0.75 的补码:1.0100000,移码:0.0100000

由于 0 的补码只有 00000000,所以它的移码也只有一个:10000000

移码只能表示顶点整数,所以它表示的范围和定点整数的补码表示范围是一致的

  • -(2^(n-1)) ~ 2^(n-1) - 1,比原码多表示位:2^(n-1)

    • -(2^7) ~ 2^7 - 1
    • -128 ~ 127

前端学习笔记
一步一个脚印

一只刚刚接触前端的小鸟

594 声望
73 粉丝
0 条评论
推荐阅读
《图解 Google V8》事件循环和垃圾回收——学习笔记(三)
这是《图解 Google V8》第三篇/共三篇:事件循环和垃圾回收这里主要讲了 2 点:事件循环:宏任务和微任务什么是微任务微任务的执行时机垃圾回收垃圾回收运行过程垃圾回收算法通过这个专栏的学习,V8 不在是个陌生...

uccs阅读 273

封面图
补计算机基础
数据存储的最小单位。在计算机中的二进制数系统中,位,简记为b,也称为比特,每个0或1就是一个位(bit)。计算机中的CPU位数指的是CPU一次能处理的最大位数二进制数系统中,位简记为b,也称为比特,每个二进制数字0...

Macrohoo1阅读 588

再快一点?动态内容如何加速
近年来 Web 3 的概念在程序员的小圈子也几乎是人尽皆知了。功能再强,噱头再足,但是如果访问速度没有跟上,一起都是浮云。哪怕拿现在已经成熟的 Web 2.0来说,内容也相当丰富,动态网页、个性化内容、电子交易数...

菜农曰阅读 948

封面图
TCP协议是如何保证数据的可靠传输的
一个数据包,从聊天框里发出,消息会从聊天软件所在的用户空间拷贝到内核空间的发送缓冲区(send buffer),数据包在传输层添加一个TCP头部、在网络层添加一个IP首部,进入到数据链路层添加一个首部和尾部,将其...

爆裂Gopher阅读 426

封面图
三体中的人列计算机到底是啥?
大家好,我是鹤涵。大家最近看三体电视剧版本了吗?跟原著还原度非常高,甚至超过原著(画面震撼呀)!其中第15集,居然出现了冯.诺依曼+秦始皇的组合,用3000w名士兵组成了一台人形计算机。作为程序员我可不困了,...

程序员鹤涵阅读 386

封面图
GBK & UTF-8
GBK是在GB2312-80标准基础上的内码扩展规范,使用了双字节编码方案,其编码范围从8140至FEFE(剔除xx7F),共23940个码位,共收录了21003个汉字,完全兼容GB2312-80标准,支持国际标准ISO/IEC10646-1和国家标准GB...

老污的猫阅读 92

一只刚刚接触前端的小鸟

594 声望
73 粉丝
宣传栏