精华内容
下载资源
问答
  • 二进制的补码

    2020-09-14 17:09:50
    今天在学习C Primer Plus(第五版)中文版.pdf时候遇到这么个问题,先上代码: #include <stdio.h> #define PAGES 336 #define WORDS 65618 int main(void) { short num = PAGES; short mnum = -PAGES; ...

    今天在学习C Primer Plus(第五版)中文版.pdf的时候遇到这么个问题,先上代码:

     

    #include <stdio.h>
    #define PAGES 336
    #define WORDS 65618
    int main(void)
    {
            short num = PAGES;
            short mnum = -PAGES;
    
            printf("num as short and unsigned short:%hd %hu\n",num,num);
            printf("-num as short and unsigned short:%hd %hu\n",mnum,mnum);
            printf("num as int and char:%d %c\n",num,num);
            printf("WORDS as int,short,and char:%d %hd %c\n",WORDS,WORDS,WORDS);return 0;
    }

     

    结果:

    num as short and unsigned short:336 336
    -num as short and unsigned short:-336 65200
    num as int and char:336 P
    WORDS as int,short,and char:65618 82 R

    请看我标红的部分,其实我蛮想不明白的,为什么-336的无符号整数是65200呢?书上说是2的补码(书中描述):数字0到32767代表它们本身,而数字32768到65535则代表负数,65535代表-1,65534代表-2,依次类推,因此-336由65536-336,也即65200来表示;本宝宝表示真心没看懂啥意思,然后就在网上各种找二进制的补码是啥意思,下面咱们就来看看什么是二进制的补码

    我试验的计算及环境假设是8位的,那接下来我就拿计算机是8位作基础来讲解:

    一、负数在计算机中如何表示

      之前我写了一篇博客,里面是计算c语言整数类型的取值范围的额,二进制中区分正负数的方法是看二进制的最高位是0还是1,1为负数,0为正数

      比如:127的二进制是01111111,而-127的二进制是 10000001(011111111 - 先取反,再加1 ->10000000+1 = 10000001),从这里可以看出127的最高位是0,而-127的最高位是1

    二、什么是二进制补码

      取一个数的二进制补码需要两步:

      1>.每个二进制位都取相反的值,也就是二进制位是1的,补码就是0,二进制位是0的,补码就是1

      2>.再把取反的二进制数转换成十进制,加上1,最后的结果就是这个数的补码的十进制数

      举例:取-127的二进制补码(8位机)

        二进制数:01111111

        补码:10000000

        结果:补码 10000000 + 1 = 10000001(129)

        也就是说-127在计算机(8位机)中10000001(写到这里,我突然有点明白C Primer Plus书中描述的啥意思:0-127代表它本身,128-255代表负数,那-127就等于256-127=129

      那可能很多人会说:为什么是这样啊?虽然知道怎么计算了,但是不知道为什么是这么计算的,那么接下来就来说说二进制补码的原理

    三、二进制补码的原理

      那大家都知道负数怎么来的,比如:A-B,那A比B小,结果就会是负数,这就有很多情况了,咱不讨论,就比如给你一个负数,那么最直接的你肯定会想到一个表达式了,比如给你个-127,那表达式就是0-127的来的,那我们把他转换成二进制来运算一下:

      预想结果:-127

      十进制表达式:0-127

      二进制表达式:00000000(0) - 01111111(127)

      以前小学数学当被减数大于减数的时候都要向上借一位来减的,那么接下来就是借位(

      重点:这里计算的时候二进制的位数是有规定的,比如-127,它是1111111 由7个1的二进制,那同学就用7个0的二进制去减,结果借一位变成了10000000(128)-1111111(127) = 1,然后在加1等于2,结果-127的补码就是00000010(2),这样可是错的,一定要遵守一个标准,那就是当前计算机是多少位的就借多少位加1位,那么比如-10是1010,就是00001010,借位就得在第9位上借,也就是100000000,结果就是246(11110110)

      借位进行运算:

        1>.100000000(256) - 01111111(127) = 10000001(129)

        2>.100000000(256) = 11111111(255) + 1;

          11111111(255) - 01111111(127) = 10000000(128)

          10000000(128) + 1 = 10000001(129)

      上面就是二进制补码的简单计算过程

    四、二进制补码有哪些好处呢?

      感觉不就是一个负数而已,非要搞的这么弯弯绕,我反正是晕了,那接下来就看下二进制补码的好处

      那我们之前说的判断最高位是1还是0来区分正负,那接下来我们就用两种表示法来计算作比较:

      举例:-10

      表达式:20 + (-10)

      1>.最高位区分正负:-10的二进制数为10001010

        二进制计算:00010100 + 10001010 = 10011110

        10011110转换成十进制是30,根据最高位区分正负,结果就是-30

      2>.再来看看二进制补码的方式进行计算:-10的二进制补码(11110101 + 1 = 11110110(246))

        二进制计算:00010100 + 11110110 = 100001010 

        而咱们刚才已经说了,假设计算机是8位的,那么这个结果超过8位,第九位会被舍弃,也就是00001010,结果就是10

    五、为什么正数加法适用于二进制补码呢?

      接下来我们求证一下X-Y(x + (-Y))这个表达式,相信大家就明白了(8位机)

      Y的二进制补码由上面的讲解大家都知道是:(11111111 - Y) + 1 ,所以也就是X加上Y的二进制补码,表达式可以写成如下格式:X + (11111111 - Y) + 1

      得到这个表达式就好办了,接下来我们分成两种情况来解释:

      1>.那就是X小于Y,那么结果肯定是个负数了,我们采用二进制的补码的逆运算,求出它对应的正绝对值,再在前面加一个负号就可以了

        第一步:计算Z、X、Y的二进制补码的表达式 Z = -((11111111 - Z) + 1);X = (11111111 - X) + 1;Y = (11111111 - Y) + 1;

        第二步:根据表达式X + (11111111 - Y) + 1来替换计算:-( ( ( 11111111 - X) + 1 ) - ( ( 11111111 - Y ) + 1 ) ) = -(11111111 - X + 1 - 11111111 + Y - 1) = -( -X + Y) = X - Y; 

      2>.X大于Y,那结果肯定是正数,那意味着Z肯定大于11111111,那根据8位机,第九位溢出了,就要舍去,表达式为(不太明白...):

        Z = Z - 100000000 = X + (11111111 - Y) + 1 - 100000000 = X - Y;

    展开全文
  • 程序员视角的计算机系统 2.3.3 二进制的补码的减法 对于x的相反数的公式为如下的公式2.15 练习问题2.33 我们表示一个位长为4的一个十六进制的数字。对于二补码解释的数,填写如下的表格: x t4x ______________ ...

    程序员视角的计算机系统 2.3.3 二进制的补码的减法
    对于x的相反数的公式为如下的公式2.15

    练习问题2.33
    我们表示一个位长为4的一个十六进制的数字。对于二补码解释的数,填写如下的表格:

    x                                       t4x
    ______________  __________________
    十六进制  十进制    十进制  十六进制
    ——————————————————
    0         ————     ————   —————
    5         ————     ————   —————
    8         ————     ————   —————
    D         ————     ————   —————
    F         ————     ————   —————

    这个情况与问题2.28相比有什么区别?

    展开全文
  • 二进制的补码求其整数值原则:先求原码,再求二进制的真值,然后转换成十进制数。1、求原码,判断补码的最高位是0还是1,若是0,表示正数,则原码同补码;若是1,表示负数,则最高位(即符号位)仍为1,其余各位求...
    由二进制的补码求其整数值
    原则:先求原码,再求二进制的真值,然后转换成十进制数
    1、求原码,判断补码的最高位是0还是1,若是0,表示正数,则原码同补码;若是1,表示负数,则最高位(即符号位)仍为1,其余各位求反后末位加1。
    2、根据原码,求真值。只需将原码的最高位变为符号即可(0变为+,1变为-)。
    3、将二进制的真值转换为十进制数。(这个就不说了吧)
    希望对你有用。可以自己举两个数来做做。
    展开全文
  • 二进制补码数取反的快速方法 简单的对每一位取反,0变1,1变成0,如何对结果进行...6的补码 6的二进制表示: 0000 0000 0000 0000 0000 0000 0000 0110 取反: 1111 1111 1111 1111 1111 1111 1111 1001 加1: 1111

    对二进制补码数取反的快速方法
    简单的对每一位取反,0变1,1变成0,如何对结果进行加1。
    一个数和它按位取反结果相加,二进制表示和一定是111····111,即二进制表示为-1.
    因此:

    x + ~x = -1
    => x + ~x + 1 = 0 
    => ~x + 1 = -x 
    

    6的补码
    6的二进制表示:

    0000 0000 0000 0000 0000 0000 0000 0110
    

    取反:

    1111 1111 1111 1111 1111 1111 1111 1001
    

    加1:

    1111 1111 1111 1111 1111 1111 1111 1010
    

    二进制表示为-6

    展开全文
  • 计算机中带符号的整数为何采用二进制的补码进行存储?  我们都知道在计算机内部数据的存储和运算都采用二进制,是因为计算机是由很多晶体管组成的,而晶体管只有2种状态,恰好可以用二进制的0和1表示,并且采用二...
  • 二进制的补码、反码

    2017-08-29 13:48:00
    从数的右边往左开始数,遇到“0”不理它,直到遇到第一个“1”为止(不包括这个1),以后的每一位数取反即是它的原码或补码,符号位不变,还是“1”(补码的补码是原码) 如原码:11010100 —– 从右往左数...
  • 吃过猪肉都知道,计算机是基于二进制补码的,一般我们是怎样计算二进制补码的呢?如下(仅举一个简单例子):  正数:01110110(2)=64+32+16+4+2=118(10);  负数:10100111(2)  1、二进制取反后+1,...
  • 转换为二进制的补码

    千次阅读 2017-12-11 14:08:57
    为了理解位操作操作符,首先需要了解整数是如何用二进制表示。我们在第2.4节讨论了这一点——整数,并将在这里展开。 考虑一个正常十进制数,例如5623。我们直观地理解这些数字是指(5×1000)+(6×100)+...
  • 计算机中带符号的整数为何采用二进制的补码进行存储?  我们都知道在计算机内部数据的存储和运算都采用二进制,是因为计算机是由很多晶体管组成的,而晶体管只有2种状态,恰好可以用二进制的0和1表示,并且采用...
  • 二进制中 : 1. 位宽不变情况下, 模 加1等于0. 模表示所有位数都是1, 例如位宽是2, 模就是11. 模加1就是 11b + 01b = 100b ,但是位宽不变, 只取低二位, 所以就是0 2. 模 = A + A反码 ( 以下用 ~A 表示) , ...
  • 用8位二进制表示机器数[一个符号位] 原码表示范围-127~+127 而用其补码表示则是-128 ~ +127 ----> 10000000~01111111,为什么10000000就是表示-128, 回答: 因为有一位是符号位,所以后7位是数值位。 2^7=128,...
  • 0-255的二进制如上图 我们惊奇地发现,如果二进制是无符号,那么我们如何表示负数呢? 我们总不能用+1表示正数,-1表示负数吧,计算机只认识0和1啊。。。于是有种想法应运而生, 最高位为符号位,用0表示正数,...
  • 问个问题,以下代码,输出多少?其中 ~ 为Java中位运算符中取反运算符。 int i = 0; System.out.println( ~i ); ...因为变量i为int类型,Java中int...表示为二进制: (+0):0000 0000 0000 0000 0000 0000 ...
  •  我们都知道在计算机内部数据的存储和运算都采用二进制,是因为计算机是由很多晶体管组成的,而晶体管只有2种状态,恰好可以用二进制的0和1表示,并且采用二进制可以使得计算机内部的运算规则简单,稳定性高。...
  • 二进制定点补码一位除法讨论二进制定点补码一位除法讨论二进制定点补码一位除法讨论二进制定点补码一位除法讨论二进制定点补码一位除法讨论二进制定点补码一位除法讨论二进制定点补码一位除法讨论...
  • 在 MATLAB 中计算有符号整数的二进制补码
  • 这些函数像内置 MATLAB 函数 BIN2DEC 和 DEC2BIN 一样在二进制字符串和十进制数之间进行转换,但可以容纳负整数(通过二进制补码)和分数正负数(通过二进制补码固定点和字符串中的二进制小数点)。 请注意,许多...
  • 四:二进制与补码二进制: 数码:0,1基数:2二进制数的权展开式:(101...加字母O表示八进制,加字母D表示十进制,加字母H是16进制负整数转二进制:先求与该负数相对应的正整数的补码,然后将所有位取反,末尾+1,不...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,183
精华内容 4,473
关键字:

二进制的补码