• 计算机基础--原码、反码、补码


    声明:以下二进制数据都是指八比特位长度的二进制数;以下十进制数都是指的整数。

    1、什么是原码?

    我们来看一下百度百科的定义:

    原码(true form)是一种计算机中对数字的二进制定点表示方法;

    原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1,其余位表示数值的大小。

    举个例子:

    100的源码怎么表示?--答案是:0 110 0100

    -100的源码怎么表示?--答案是:1 110 0100

    此外,还要注意一点:

    百度百科中看到一句话:原码不能直接参加运算,可能会出错。

    他举出一个例子:在数学中 1+(-1)=0;但是用二进制进行计算的时候就会变成:0000 0001+1000 0001=1000 0010,换算成十进制是 -2。显然结果是错误的。

    2、什么是反码?

    反码通常是用来由原码求补码、或者由补码求原码的过渡码。

    那么同一个数的反码与原码的对应关系是什么呢?反码跟原码是正数时,一样;负数时,反码就是原码符号位除外,其他位按位取反。

    举个例子:

    100的原码是?0 110 0100

    100的反码是?0 110 0100

    ========

    -100的原码是?1 110 0100

    -100的反码是?1 001 1011

    从上面的例子来看

    I、想知道一个十进制数的二进制反码表示形式,得先知道这个十进制数的原码。也就是说,原码虽然简单,但却非常重要。

    II、原码、反码都是数值在计算机中的表示方法,他们俩首位都表示符号位,即1为负、0为正;其余的为数值位。原码的数值位的值就是所表示数的真值。反码的数值位的意义我们不去深究。

    3、什么是补码?

    在了解什么是原码的时候,我们就发现了原码在二进制加减运算中存在问题。

    所以,计算机系统,数值一律采用补码来表示和存储。

    原因是,补码能够将符号位和数值位统一处理;同时,减法和加法也可以统一处理。

    在百度百科中,关于补码的概念引入,他给出了一个非常有趣的例子:https://baike.baidu.com/item/%E8%A1%A5%E7%A0%81/6854613?fr=aladdin

    这个例子解释了以n值为模的系统里,减法问题如何转化成加法问题的--把减数用相应的补数表示就可以了。

    而这个例子中出现的补数的概念,用在计算机对于数值的处理上,就是 补码。

    那么补码和原码的对应关系是怎么样的呢?

    I、对于正数,他的原码、反码、补码都是一样的,即都是原码的表示形式。

    比如:100的原码 0 110 0100;反码 0 110 0100;补码 0 110 0100。

    II、对于负数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变--这不就是求反码的过程么。),然后加1。

    比如:-100的原码 1 110 0100;除符号位外按位取反 1 001 1011;再加1:1 001 1100(即为-100在计算机中的存储形式--也就是-100的补码)。

    III、对于-100求补码的方法,还有一种:

    就是记住这个口诀:对负数求补码,先写出其绝对值的原码,再按位取反,再加1。

    我们来试一下:-100求补码,先找出-100的绝对值100的原码:0 110 0100;再按位取反 1 001 1011;再加1: 1 001 1100。

    其实这两种,在第二步取反的时候,就得到了一致的结果了,所以在第三步再加1,得到的结果一样。所以上面两种方法就看个人习惯了。。。

    IV、对于0的补码是唯一的:0000 0000。

    (+)0我们就不必说了,符号位为0的正数,原码、反码、补码都一样:0000 0000。

    (-)0求补码→按位取反→1 111 1111→再加1→1 0000 0000(这里我们讲解的是8位二进制数,所以最高位1舍去)→ 0000 0000 (补码)。

    最后总结:原码、反码、补码(以下都是指整数的八位二进制形式)

    对于正数 其原码、反码、补码都一样。以后遇到正数求补码、反码不要慌,写出原码就是答案。

    对于负数 其反码=原码(除符号位)按位取反;其补码=负数的原码先取反码再加1。

    4、计算机中存储的8位二进制数能够表示的取值范围为什么是 -128~127

    首先我们要在脑海中有一个概念:我们这里所说的二进制数是指在计算机中存储的数,而在计算机中存储的数是原始数据的补码形式。

    有了这个概念为前提,我们就好理解了:

    接下来参考一下知乎里面的一个回答,更能够帮助我们理解这个范围问题:

    https://www.zhihu.com/question/20458542

    以上是对计算机系统中对于数的二进制表示形式的总结,记录下来,以便以后查看。

  • 相关阅读:
    C#中 Thread,Task,Async/Await,IAsyncResult 的那些事儿!
    Java8的新特性以及与C#的比较
    点旋转坐标变换
    vc++返回模块路径
    为什么不要 "lock(this)" ? lock object 并是readonly(转载)
    《黄帝内经》要义
    C++多线程编程简单实例
    c++ 获取文件大小
    c# 获取文件夹大小
    自动驾驶仿真工具的下载与安装
  • 原文地址:https://www.cnblogs.com/bigbosscyb/p/13509976.html
Copyright © 2020-2023  润新知