嵌入式硬件篇—原码、补码、反码


文章目录

  • 前言
  • 简介
  • 八进制原码、反码、补码
  • 1. 原码
  • 规则
  • 示例
  • 问题
  • 2. 反码
  • 规则
  • 示例
  • 问题
  • 3. 补码
  • 规则
  • 示例
  • 优点
  • 4. 补码的运算
  • 5. 总结
  • 十六进制原码、反码、补码
  • 1. 十六进制的基本概念
  • 2. 十六进制的原码
  • 规则
  • 示例
  • 3. 十六进制的反码
  • 规则
  • 示例
  • 4. 十六进制的补码
  • 规则
  • 示例
  • 5. 十六进制补码的运算
  • 示例:计算 5 + (-3)
  • 6. 十六进制补码的范围
  • 7. 总结
  • 总结

  • 前言

    本文仅仅简单介绍了八进制、十六进制的原码、反码、补码。


    简介

    在计算机中,源码、补码和反码是表示有符号整数的三种方式,主要用于处理负数。下面详细介绍它们的概念和转换方法,并通过示例说明。

    八进制原码、反码、补码

    1. 原码

    源码是最直观的表示方法,直接用最高位表示符号(0 表示正数,1 表示负数),其余位表示数值的绝对值

    规则

    正数:符号位为 0,数值部分为二进制绝对值

    负数:符号位为 1,数值部分为二进制绝对值

    示例

    8 位二进制为例:

    +5 的源码:00000101
    -5 的源码:10000101

    问题

    1. 源码的缺点是 0 有两种表示形式:00000000(+0)和 10000000(-0)。
    2. 加减法运算不方便,需要额外处理符号位。

    2. 反码

    反码是为了解决源码加减法的问题而提出的。正数的反码与源码相同负数的反码是对源码的数值部分逐位取反(符号位不变)

    规则

    正数:与源码相同。
    负数:符号位为 1,数值部分逐位取反。

    示例

    +5 的反码:00000101(与源码相同)
    -5 的反码:11111010(符号位不变,数值部分取反)

    问题

    1. 反码仍然存在 +0 和 -0 的问题。
    2. 加减法运算时,最高位的进位需要循环加到最低位(称为“循环进位”),增加了复杂性。

    3. 补码

    补码是目前计算机中最常用的表示方法,解决了反码的问题。正数的补码与源码相同,负数的补码是对反码加 1。

    规则

    正数:与源码相同。
    负数:符号位为 1,数值部分逐位取反后加 1。

    示例

    +5 的补码:00000101(与源码相同)

    -5 的补码:
    源码:10000101
    反码:11111010
    补码:11111011(反码加 1)

    优点

    1. 0 只有一种表示形式:00000000。
    2. 加减法运算可以直接进行,无需额外处理符号位。
    3. 补码表示的范围比源码和反码更大。

    4. 补码的运算

    补码的最大优势是加减法可以直接用二进制运算完成。

    示例:计算 5 + (-3)
    5 的补码:00000101

    -3 的补码:
    源码:10000011
    反码:11111100
    补码:11111101

    相加:

    00000101 (5)
    +11111101 (-3)


    100000010
    由于是 8 位二进制,最高位的进位被丢弃,结果为 00000010,即 2。

    5. 总结

    源码:直观,但加减法复杂
    反码:解决了部分问题,但仍存在 +0 和 -0 的问题
    补码:解决了所有问题,是现代计算机的标准表示方法。
    通过补码,计算机可以高效地进行有符号整数的加减法运算,同时避免了符号处理的复杂性。

    十六进制原码、反码、补码

    1. 十六进制的基本概念

    十六进制(Hexadecimal)使用 16 个符号表示数值:0-9 和 A-F(A=10, B=11, …, F=15)。

    每个十六进制位对应 4 个二进制位。
    例如,0x1A 表示二进制的 00011010。

    2. 十六进制的原码

    原码是数值的直接表示,最高位表示符号(0 为正,1 为负),其余位表示数值的绝对值。

    规则

    正数:符号位为 0,数值部分为十六进制绝对值。
    负数:符号位为 1,数值部分为十六进制绝对值。

    示例

    假设使用 8 位十六进制数(32 位二进制),最高位为符号位:

    +5 的原码:0x00000005
    -5 的原码:0x80000005(最高位 8 表示符号位为 1)

    3. 十六进制的反码

    反码是为了解决原码加减法的问题而提出的。正数的反码与原码相同,负数的反码是对原码的数值部分逐位取反(符号位不变)。

    规则

    正数:与原码相同。
    负数:符号位为 1,数值部分逐位取反。

    示例

    +5 的反码:0x00000005(与原码相同)
    -5 的反码:
    原码:0x80000005
    数值部分取反:0x7FFFFFFA
    因此,-5 的反码为:0x7FFFFFFA

    4. 十六进制的补码

    补码是目前计算机中最常用的表示方法,解决了反码的问题正数的补码与原码相同,负数的补码是对反码加 1。

    规则

    正数:与原码相同。
    负数:符号位为 1,数值部分逐位取反后加 1。

    示例

    +5 的补码:0x00000005(与原码相同)
    -5 的补码:
    原码:0x80000005
    反码:0x7FFFFFFA
    补码:0x7FFFFFFB(反码加 1)

    5. 十六进制补码的运算

    补码的优势在于可以直接进行加减法运算,无需额外处理符号位。

    示例:计算 5 + (-3)

    5 的补码:0x00000005
    -3 的补码:
    原码:0x80000003
    反码:0x7FFFFFFC
    补码:0x7FFFFFFD

    相加:

    0x00000005 (5)
    +0x7FFFFFFD (-3)


    0x80000002
    结果为 0x80000002,即 2。

    6. 十六进制补码的范围

    对于 32 位十六进制数(8 位十六进制):

    正数范围:0x00000000 到 0x7FFFFFFF(0 到 2,147,483,647)
    负数范围:0x80000000 到 0xFFFFFFFF(-2,147,483,648 到 -1)

    7. 总结

    原码:直接表示数值,最高位为符号位
    反码:正数与原码相同,负数为原码数值部分取反
    补码:正数与原码相同,负数为反码加 1
    十六进制补码:与二进制补码的原理相同,只是用十六进制表示。
    通过十六进制补码,计算机可以高效地进行有符号整数的加减法运算,同时避免了符号处理的复杂性。


    总结

    以上就是今天要讲的内容,本文仅仅简单介绍了八进制、十六进制的原码、反码、补码。

    作者:Ronin-Lotus

    物联沃分享整理
    物联沃-IOTWORD物联网 » 嵌入式硬件篇—原码、补码、反码

    发表回复