转载的关于 二级制的反码,补码,原码等,筛选过的.
发布日期:2021-05-20 06:41:11 浏览次数:19 分类:精选文章

本文共 1721 字,大约阅读时间需要 5 分钟。

一. 机器数和真值

在学习原码、反码和补码之前,需要先了解机器数和真值的概念。
机器数是一个数在计算机中的二进制表示形式,带有符号位,正数为0,负数为1。例如,计算机字长为8位时,+3的机器数是00000011,而-3则是10000011。真值则是指去掉符号位后的实际数值。

二. 原码、反码、补码的基础概念和计算方法

对于一个数,计算机使用一定的编码方式进行存储。原码、反码和补码是机器存储具体数字的编码方式。

  • 原码:
    原码的表示方法是在符号位上存放符号,剩余位存放真值的绝对值。
    例如,8位二进制:
    • [+1]原 = 00000001
    • [-1]原 = 10000001

    原码的表示范围为[-127, +127],因为8位的最高位为符号位,其余7位表示真值绝对值。

    1. 反码:
      正数的反码与原码相同,负数的反码是其原码的反面。
      例如:
      • [+1]原 = [00000001] = [00000001]反
      • [-1]原 = [10000001] = [11111110]反

      反码的优点在于减法可以被转换为加法,计算机可以通过加法来处理减法运算。然而,负数的反码不易直观识别,且0有两种表示形式(00000000和10000000),这可能导致潜在的问题。

      1. 补码:
        补码的表示方法是:
        • 正数的补码与原码相同。
        • 负数的补码是在原码的基础上,符号位不变,其余位取反后加1。

        例如:

        • [+1]原 = [00000001] = [00000001]反 = [00000001]补
        • [-1]原 = [10000001] = [11111110]反 = [11111111]补

        补码的用途主要是为了解决减法与加法统一的需求。通过将符号位参与运算,减法可以被转换为加法,同时也解决了0的表示问题,还扩大了数值的表示范围。例如,8位补码的范围变为[-128, 127],比原码和反码的[-127, 127]多表示了一个最小的负值(-128)。然而,具体的历史选择补码原因可能与计算机内部电路的设计和性能优化有关。

        三. 为何要使用原码、反码、补码

        原码、反码和补码各有优缺点。反码可以通过加法实现减法,但负数的反码不易直观识别,而且余数问题导致了0的多重表示。补码则修复了这些问题,同时扩展了表示范围,使得计算机能够更高效地进行运算。

        补码的设计基于同余概念,通过将负数转换为模运算的正数,减少了运算中符号位的复杂性。例如,在8位二进制中,-1的补码为11111111,而11111111的真值为-1。这与模12运算中的-3模12=9类似,都是将负数转换为正数同余体。通过这种方式,补码不仅解决了运算中的符号问题,还为计算机加法器的设计提供了简化的路径。

        四. 原码、反码、补码的再深入

        计算机巧妙地将符号位参与运算,通过将减法转换为加法,竟隐含着深刻的数学原理。此数学原理基于同余定理,包括反身性和线性运算定理。这些定理使得同余数在计算中能够相互转换,从而实现减法的加法模拟。例如,-2-1在补码运算中可以表示为10000010 + 11111100 = 10000011,即-5的原始码值。然而,通过补码运算,这实际上是计算理解为2+126,而126是2在模127下的同余体,正好对应于-1的反码。替代数和计算机中的模运算规则使得减法可以被简化为加法,从而降低了计算机内部电路的复杂性。

        补码的核心思想是其对0的处理。通过将零固定表示为全0码,避免了反码中对应的双重表示问题。而补码的最小值比原码和反码多了一个,可以表示为-2^n,其中n为二进制位数。例如,8位补码可以表示[-128, 127],而不像原码或反码那样仅表示[-127, 127]。因此,补码的选择不仅解决了运算上的问题,还是为了扩展表示范围,满足对更大负数的需求。

        五. 总结与展望

        通过对原码、反码、补码的学习,了解到它们各自的优势与不足,以及计算机为什么选择使用补码进行运算的初衷。初次接触时可能会对补码为什么比原码或反码更优的选择感到困惑,但通过深入理解其数学基础和历史背景,可以逐渐掌握其中的智慧和实用性。这也引发了更多关于计算机数值表示和运算原理的思考,值得在今后的学习中持续探索和实践。

    上一篇:迭代和递归的一些比较
    下一篇:使用一个For 循环打印九九乘法表

    发表评论

    最新留言

    做的很好,不错不错
    [***.243.131.199]2025年05月03日 14时27分24秒