精华内容
下载资源
问答
  • 十进制数-38的8位二进制补码是首先,写出原码 :? 1010 0110?? ,???? 最高的1表示负号?负数的补码是其原码的各位取反,再加1 ,(最高符号除外),所以,?十进制数-38的8位二进制补码是?? 1101 1010关于二进制...

    十进制数-38的8位二进制补码是

    首先,写出原码 :? 1010 0110?? ,???? 最高位的1表示负号?负数的补码是其原码的各位取反,再加1 ,(最高位符号位除外),所以,?十进制数-38的8位二进制补码是?? 1101 1010

    关于二进制补码,它可以用来表示小数吗二进制补码可以用来表示小数吗?还有给我一段二...

    【二进制补码可以用来表示小数吗?】

    可以,不过需要你自己来处理.方法是,按照所需要的精度,将该小数放大若干倍,当整数处理.

    为方便通常放大2的若干次方倍.

    这样,你就可以把这个整数看成“定点小数”,即保留了若干位二进制小数的定点数.

    有些资料上,将这种格式称作Q格式.如“Q8格式”就是保留了8位小数位的定点数.

    这种定点小数,做加减法时,需要小数点对齐,必要时需先做移位操作.

    乘除法时,也要掌握小数点位置.例如“Q8格式”和“Q4格式”的数相乘,其积应该看做“Q12格式”的.

    需注意C语言中的移位操作中,其“右移”分为“算术右移”和“逻辑右移”两种.对于“有符号”数,实行的是“算术右移”,对于“无符号数”,实行的是“逻辑右移”.

    如果您的程序中定义变量类型时定义的正确,那么你这些右移操作就不会错误.

    如果您的程序中有“无符号”和“有符号”混用的地方,或强制类型转换的地方,需要注意这点不要出错.

    “算术右移”和“逻辑右移”的区别:

    “逻辑右移”时最高位一律补零.

    “算术右移”时最高位保持不变,即:负数补1,正数补零.

    例如,用Q4的格式来表示0.75,放大2的4次方倍,为12,

    机器码是0000000000001100

    可以看做是定点小数000000000000.1100

    另,用Q4的格式来表示-0.75,放大2的4次方倍,为-12,

    机器码是1111111111110100

    可以看做是定点小数111111111111.0100

    如上,按Q4格式,用12代表0.75,用-12代表-0.75.

    要做(0.75)×(-0.75)用(12)×(-12)代表,乘得(-144).

    -144的机器码是1111111101110000

    看做Q8格式的定点小数11111111.01110000

    可以代表-0.5625.(等于-144/256,即-9/16)

    假如下面又要做别的运算,需要把这个Q8的定点小数化为Q4格式,那么,可以用>>4的运算,把这个数“算术右移”4位,得111111111111.0111.(这个数,如果当普通整数看,就是-9.)

    请注意这里右移的时候最高位补了4个1.

    【给我一段二进制补码,我怎么将其还原成十进制的数值?】

    首先,要知道其字长.以16位字长为例:

    16位字长如果是无符号数,可以表达的十进制数的范围是0 ~65535;

    如果是有符号数,可以表达的十进制数范围是-32768 ~ +32767.

    这里65536是2的16次方,32768是2的15次方.

    正整数的二进制化十进制想您应该知道吧?例如10010000化为十进制就是

    ((((((1×2+0)×2+0)×2+1)×2+0)×2+0)×2+0)×2+0 = 144

    给你一个有符号数的补码表示法的16位二进制代码,暂时先按照上述无符号数(即正整数)的规则,化为十进制;

    然后,看其符号位(最高二进制位)是否是1:

    如果是0,就表示它是正数.结果就对了.

    如果是1,就表示它应是负数,将此暂时值再减去65536,所得结果(负数)就是应有的结果了.

    上述“看其符号位是否是1”的判断,也可以代之以“看暂时值是否不小于32768”.

    例如:1111111111110111按照上述规则,得暂时值为65527.

    因为符号位是1,说明它应该是负数:65527 - 65536 = -9.

    对于n位二进制有符号补码除法x/y,要求不溢出的条件如下图,求解释为什么不溢出的条件是这样的

    y在分母,分母不能为0,就是y≠0了。这和数学当中的要求是一样的,编程时也要用条件语句来判断,然后再计算。

    C语言求二进制补码?源代码

    输入任意整数,输出32位的补码。

    输入其他,结束程序。

    #include

    int main()

    {

    int i,num=0;

    char s[33]={0};

    while(1==scanf("%d",&num)){

    for(i=0;i<32;i++){

    s[i]= (0x01 & (num>>(31-i))) ? '1' : '0' ;

    }

    printf("%s\n",s);

    }

    return 0;

    }

    展开全文
  • 二进制补码范围简单总结

    千次阅读 2013-09-07 20:38:24
    8位补码范围是 -128至127. 根据补码的几条规定即可推出上述结论: 1 若二进制全为0,则表示数0 2 若最高(即符号)为0,表示正数 3 若最高为1, 表示是负数,而该负数的绝对值是多少呢?将每个二进制位(包括...

    8位补码范围是 -128至127.
    根据补码的几条规定即可推出上述结论:
    1 若二进制每位全为0,则表示数0
    2 若最高位(即符号位)为0,表示正数
    3 若最高位为1, 表示是负数,而该负数的绝对值是多少呢?将每个二进制位(包括符号位)取反加1,得到一个二进制数,将该数看成无符号数,其值就是上述负数的绝对值。

    例如,二进制的 10000000 的最高位为1, 所以它表示的是负数。是负的多少呢?我们将其八位全部取反,得到01111111, 然后加1,得到10000000. 将该数看作无符号数,值为128, 故计算机中的10000000表示的是-128。【关于这一点要死记硬背了,可以参考下面列出的对比数记忆】

    最高位(即符号位)为1的8位有符号数有128个,故可表示128个负数;最高位为0的8位有符号数有128个,但全0的那个表示数0,所以总共只能表示127个正整数。

     

     

    具体列出如下,对比看一目了然:

    十进制:0(正零、负零都一样,就一个零)

    00000000--------0

    十进制正数:(从0_0000001到0_1111111共127个数,所以最大正数是127)

    0_0000001--------(1)

    0_0000010--------(2)

    0_0000011--------(3)

    ................

    0_1111111--------(127)

    十进制负数:(从0_1111111到0_0000000共128个数,所以最大负数是-128)

    1_1111111--------(-1)

    1_1111110--------(-2)

    1_1111101--------(-3)

    ................

    1_0000000--------(-128)        这是最小的数

    记忆办法:首先,除去符号位,数的个数都是从全7个0到全7个1。其次,正数和负数范围都是7位,只不过负数从全7个0到全7个1共128个数,而正数由于全7个0被零占去了,所以从0_0000001到全7个1共127个数。

    展开全文
  • 二进制补码到十进制补码及其内的运算——关于补码的一点学习
                   

     

    问题:输入两个整数a,b-10100<a, b < 10100, 编程计算a-b

    这是个非常简单的题目,因为a,b可能为正可能为负,所以有a-b, a-(-b), -a-b,-a-(-b)这四种情况。去括号后有a-b,-(a-b), a+b, -(a+b),其中共两种情况。写代码的话仍然比较烦。想到二进制的补码运算可以把减法变成加法从而统一加减运算,于是考虑实现十进制的补码运算。十进制的补码运算以及各种进制的运算(做这个题目时查看TAOCP第二卷时学到了关于任意进制的一些东西,包括b进制和bk进制的转换,尤其是-10进制,sqrt(2)进制等等,非常有趣,附在后面)在网上资料非常多,这里只是记下自己做这个题目的过程,备忘。

    二进制的补码运算是非常熟悉的了。(X+Y)X+Y(X-Y)X+(-Y),这是补码能统一加减运算的公式,对于十进制也是一样。对于任何进制的补码,都有公式:

    [X]=M+X(MOD M)

    有了这些,将补码应用于十进制就非常简单。自己当时有些偏执,一定想找两个数放在符号位上,替代二进制中01负的作用。因为二进制中,0表示什么都没有,1表示再放一个就会溢出,所以十进制中,用0取代二进制中的0,放在符号位上表示正,用9取代二进制中的1,放在符号位上表示负(其实自己把问题弄复杂了,大可不必如此)。这样,包括符号位在内的n个十进制位补码能表示的范围是[-10n-1, 10n-1-1]总共10n个数。例如,计算-46-37这个式子:-46的原码就是946,补码按位取反末位加1,得到954-37的原码为937,补码为963,补码相加得(-46)+(-37)补=954+963=1917,符号位进位舍掉,得到结果是917917的再按位取反末位加1得原码983,它表示的真值是-83,所以有-46-37=-83

    以上如果想计算-99-99就会溢出,如此必须用四位十进制位表示。但一个字节对计算机来说九牛一毛,所以到这里直接就写程序了。代码如下:

    #include <stdio.h>#include <string.h>char a[128], b[128], ta[128], tb[128];int main() { int i, j; scanf("%s%s", a,b); if(*a == '-') {  ta[103] = 9;  for(i = 0, j = strlen(a) - 1; j >= 1; i++, j--)   ta[i] = 9 - (a[j] - '0');  while(i <= 102) { ta[i] = 9; i++; }  ta[0] += 1; } else {  ta[103] = 0;  for(i = 0, j = strlen(a) - 1; j >= 0; i++, j--)   ta[i] = a[j] - '0'; } if(*b == '-') {  tb[103] = 0;  for(i = 0, j = strlen(b) - 1; j >= 1; i++, j--)   tb[i] = b[j] - '0'; } else {  tb[103] = 9;  for(i = 0, j = strlen(b) - 1; j >= 0; i++, j--)   tb[i] = 9 - (b[j] - '0');  while(i <= 102) { tb[i] = 9; i++; }  tb[0] += 1; } for(i = 0; i <= 103; i++) {  tb[i] += ta[i];  tb[i + 1] += tb[i] / 10;  tb[i] %= 10; } // print if(tb[103] == 0) {  for(i = 102; tb[i] == 0; i--);  while(i >= 0) { putchar(tb[i] + '0'); i--; }  putchar('/n'); } else {  for(i = 0; i <= 102; i++)   tb[i] = 9 - tb[i];  tb[0] += 1;  for(i = 0; tb[i] >= 10; i++) {   tb[i+1] += tb[i] / 10;   tb[i] %= 10;  }  putchar('-');  for(i = 102; tb[i] == 0; i--);  while(i >= 0) { putchar(tb[i] + '0'); i--; }  putchar('/n'); } return 0;} 

    这段代码只是为了AC

    现在小结一下。二进制补码定义形式非常漂亮,因为它具有对称性。在二进制里面,很多的东西都是“恰好如此”。恰好二进制只有01两个数,恰好只有正负两种状态,恰好2n+2n=2n+1……。在补码的对应规则下,n个数位能表示的数的个数还是那么多,只不过把其中的一半的正数的形式让给了负数。在这个意义下再看十进制的补码,如果是n位十进制数,它能表示10n个十进制数字串,如果使用补码,它必须分一半出来用于表示负数,所以它只能表示0.5 * 10n = 5 * 10n-1个正数。另外的一半就是负的了。我们常说的在补码表示中“符号位参与运算”这个优点,其实并没有什么,只不过权值最高的数位恰好同时能够表示一个数的正负而已,它本来就是应该而且必须参与到运算中去的。

    模仿二进制补码的形式定义十进制的补码如下:对于定点整数n+1位的十进制定点整数X=XnXn-1…X0,其补码为:

    [X]X, 如果0 <= X <=5 * 10n-1

    [X]10n+1 + X = 10n+1 - | X |,如果 -5 * 10n <= X<= -1

    当最高位Xn01234时,表示正,为56789时,表示负。例如三位十进制数补码能表示-5004991000个数。例如下列计算:

    -327+164: -327的补码是673-327à673, +164à164,-327+164à673+164=837, 837是负数,并且它是补码形式,它的绝对值的真值是163.所以-327+164=-163

    当运算结果的绝对值大于500时,会发生溢出。可以使用类似计算机组成原理中的双符号位检测是上溢还是下溢,但通常没有必要,不如把多出来的符号位用来参加计算,使得能够表示的数的范围扩大十倍,以前的溢出自然就没有了。

    下面是读到KnuthTAOCP第二卷的这一节时了解到的其它十分有趣的知识。自己只是走马观花看了一下,把记下来的记在这里:一,b进制和bk进制的互相转换非常简单,看2进制和8进制、16进制的互相转换就明白了。二,-10进制和-2进制是被发现非常有意思的。-2进制似乎也得到了应用。其它比如sqrt(2)i进制等等,非常神奇。这些进制的定义和其它进制一样,只不过每个数位上的权不一样了。例如,要把126这个十进制数转变成-10进制,还是那样除基取余的方法即可,126 / (-10) = -12……6,-12 / (-10) = 2……8,所以十进制的126-10进制下的表示是286.可以验算一下,2 * (-10)2 + 8 *(-10)1 + 6 = 126.不过-10进制数的运算规则自己还没学会。

    关于原码转变成补码的方法,在网上都能找到证明。

     

               

    再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

    展开全文
  • 二进制补码

    千次阅读 2017-09-17 20:39:05
    二进制补码 1.概述  计算机系统的内部是以二进制形式存储数据。  在Java程序中输入的十进制的数据都会被自动转换为二进制,Java内部也以二进制来进行数值运算,但返回的结果是十进制。 2.补码规则  ...

    二进制补码


    1.概述

     计算机系统的内部是以二进制形式存储数据。

     在Java程序中输入的十进制的数据都会被自动转换为二进制,Java内部也以二进制来进行数值运算,但返回的结果是十进制。


    2.补码规则

      二进制的最高位是符号位,0表示整数,1表示负数。

      正数的值是其本身,负数的值是其最高位(符号位)不变,其余位取反,再加1。


    例如:(1101)2

         010 按位取反

         011 加1

        (1011)是-3


      两数相加,若最高位(符号位)有进位,则进位被舍弃。

    例如:4位二进制补码中,5-3的结果是2。

            0101   5

           +1101   -3

            0010   2


    3.为什么要使用补码

     --可以将符号位和其他位统一处理;

     --最高位不再表示数值,而是作为符号位,正好将数值折半,一半是0至正数,一半是负数。

     例如:4位二进制数共有16个数,用补码表示,则一半是0~7,一半是-1~-8.

         8位二进制数共有256个数,用补码表示,则一半是0~127,一半是-1~-128


     --减法也可以按加法来处理:

     例如:7-3,可以表示为7+(-3)

     

    4.补码运算的特征

      --计算机中的正数和负数的关系是取反加1;

      --补码运算是封闭的:运算结果保留在补码范围之内,超范围就溢出。

      

    5.补码运算的原理

     正数+负数=模

     模:某种类型数据的总数,

    例如:

     4位二进制数的模是16

     8位二进制数的模是256

     16位二进制数的模式65536

     





    展开全文
  • 8位二进制表示机器数[一个符号] 原码表示的范围-127~+127 而用其补码表示则是-128 ~ +127 ----> 10000000~01111111,为什么10000000就是表示-128, 回答: 因为有一是符号,所以后7是数值。 2^7=128,...
  • 一个Long类,用于表示从派生的64位二进制补码整数值,供独立使用并在无符号支持下扩展。 背景 从,“数值类型中可表示幅度不大于2 53的所有正整数和负整数”,即“代表IEEE标准中指定的双精度64格式IEEE 754值二...
  • 1. 在计算机里,通常用数字后面紧跟一个英文字母来表示该数的数字,十进制一般用D,二进制用B,进制用O,十六进用H来表示,2.首先,十进制数转换成二进制,除2取余,按箭头方向写,自上而下写出来,所以45D转换成...
  • 笔者刚学数字电路,就在二进制补码处踩了许多坑,下面就来写一下我对二进制补码的感悟。 提示:以下是本篇文章正文内容,下面案例可供参考 一、生活中了解补码 首先展示一下求补码的公式N(补)=R^n-N 这里的N是原码...
  • 输出二进制补码

    千次阅读 2014-05-23 18:17:08
    * 2:输出二进制补码 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 输入若干int型整数,输出每个整数的二进制补码。 输入 输入有若干行,除最后一行外,每行包含一个int型整数。最后一行仅包含...
  • 2:求负整数的二进制补码:先求与该负数相对应的正整数的二进制代码,然后所有取反加1,不够位数时左边补1,例如,求-3的二进制补码,先求3的二进制补码,3=11,取反之后为00,加1之后为01,假设用八位二进制表示...
  • java基础 二进制补码

    2015-03-21 11:49:00
    二进制补码: 1、计算机系统的内部以二进制形式存储数据。 2、在Java程序中输入的十进制的数据都会被自动转换为二进制,Java内部也以二进制来进行数值运算,但返回的结果是十进制。 二进制补码的原理: 正数+...
  • 0.1.2 二进制补码

    2014-09-03 13:44:00
    《编程导论(Java)·0.1.2 二进制补码》 p6:【冯•诺伊曼体系结构计算机使用二进制。人类之所以习惯十进制,据说是由于用手指头来计算比較方便,而人正好有10个指头。】 本节就2面(page6和p7)纸。尽管二进制...
  • 关于二进制补码

    2017-07-12 22:25:18
    最近把大学期间没弄清楚的二进制补码理清了,谢谢网络,谢谢阮大牛... 以下内容复制于阮一峰的博客,源地址链接 问一个基本的问题。 负数在计算机中如何表示? 举例来说,+8在计算机中表示为二进制的1000,那么-8...
  • 最大+127,最小 -128补码表示的数,是没有正负0的,因此除了最高的符号以外,可以表示的数最大为 127,因此最大为 +127 而因为 10000000,并不是表示为 -0 因此人家用 1000000表示 -128 转载于:...
  • 低于a和b(十六进制),表示二进制补码有符号二进制数.例如:a = 0x17c7cc6eb = 0xc158a854现在我想知道一个&的签名代表.基础10中的b.抱歉,我是一名低级程序员,也是python的新手;问这个问题感觉非常愚蠢.我不关心额外的...
  • 二进制补码计算器 该库包含用于计算十进制数的二进制补码的函数,反之亦然; 二进制补码表示形式既可以二进制表示,也可以十六进制表示。 这些函数支持使用-2147483648至2147483647的32整数,因为它们使用了...

空空如也

空空如也

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

8位二进制补码范围