精华内容
下载资源
问答
  • 在 MATLAB 中计算有符号整数的二进制补码
  • 完整代码如下 number=int(input("Enter ...0000 0000 0000 0000 0000 0000 0000 0101 首先将十进制转化为二进制数 以67为例 67%2:1 67//2 33%2:1 33//2 16%2:0 16//2 8%2:0 8//2 4%2:0 4//2 2%2:0 2//2 1%2:1 1//2

    完整代码如下

    number=int(input("Enter an interger:"))
    L=[]
    if number<0:
        mid=number*(-1)
    else:
        mid=number
    while mid!=0:
        L.append(mid%2)
        mid=mid//2
    if len(L)<32:
        for i in range(32-len(L)):
            L.append(0)
    L.reverse()
    if number<0:
        L[0]=1
    # print(L)
    # 正数的补码输
    if number<0:
        for i in range(len(L)-1,0,-1):
            if L[i]==1:
                pos=i
                break
        for i in range(1,pos):
            if L[i]==0:
                L[i]=1
            else:
                L[i]=0
    print(L)
    counter = 0
    for i in range(len(L)):
        print(L[i], end='')
        counter += 1
        if counter % 4 == 0:
            print(end=' ')

    例如:输入3

    输出为:0000 0000 0000 0000 0000 0000 0000 0011

    输入:5

    输出:0000 0000 0000 0000 0000 0000 0000 0101

    首先将十进制数转化为二进制数

    以67为例 
    67%2:1  67//2
    33%2:1  33//2
    16%2:0  16//2
    8%2:0   8//2
    4%2:0   4//2
    2%2:0   2//2
    1%2:1   1//2
    

     

     

     

     

     

     

     

     

    展开全文
  • 二进制补码

    千次阅读 2020-09-14 17:09:50
    那就是X小于Y,那么结果肯定是个负数了,我们采用二进制的补码的逆运算,出它对应的正绝对值,再在前面加一个负号就可以了 第一步:计算Z、X、Y的二进制补码的表达式 Z = -((11111111 - Z) + 1);X = (11111111 - ...

    今天在学习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;

    展开全文
  • 二进制补码求其整数值原则:先原码,再求二进制的真值,然后转换成十进制。1、原码,判断补码的最高位是0还是1,若是0,表示正数,则原码同补码;若是1,表示负数,则最高位(即符号位)仍为1,其余各位...
    由二进制的补码求其整数值
    原则:先求原码,再求二进制的真值,然后转换成 十进制数
    1、求原码,判断补码的最高位是0还是1,若是0,表示正数,则原码同补码;若是1,表示负数,则最高位(即符号位)仍为1,其余各位求反后末位加1。
    2、根据原码,求真值。只需将原码的最高位变为符号即可(0变为+,1变为-)。
    3、将二进制的真值转换为 十进制数 。(这个就不说了吧)
    希望对你有用。可以自己举两个数来做做。
    展开全文
  • 这些函数像内置的 MATLAB 函数 BIN2DEC 和 DEC2BIN 一样在二进制字符串和十进制之间进行转换,但可以容纳负整数(通过二进制补码)和分数正负数(通过二进制补码固定点和字符串中的二进制小数点)。 请注意,许多...
  • 十个八位十六进制数字,装换为二进制,然后取其补码,然后其平均值。用c编写,代码稍微有点问题,大家可以完善下
  • 二进制补码减法公式推导

    千次阅读 2020-10-30 12:19:59
    二进制中 : 1. 位宽不变的情况下, 模 加1等于0. 模表示所有的位数都是1, 例如位宽是2, 模就是11. 模加1就是 11b + 01b = 100b ,但是位宽不变, 只取低二位, 所以就是0 2. 模 = A + A的反码 ( 以下用 ~A 表示) , ...

    二进制中 :

    1. 位宽不变的情况下,膜 加1等于0. 膜表示所有的位数都是1, 例如位宽是2, 膜就是11.
       模加1就是 11b + 01b = 100b ,但是位宽不变, 只取低二位, 所以就是0

    2. 膜  = A + A的反码 ( 以下用 ~A 表示) , 例如 11 = 01 +10 , 但是这里 A 不能等于膜, 否则就是 A=A 没法继续计算求值. A是大于0的正数,


    所以

            模       = A + ~A

    =>   模  +1 =A + ~A +1
     
    =>   0        = A + ~A +1

    =>       -A  = ~A +1 (称作-A的补码)

    所以八位数的 -3 可以用 ~00000011+1=11111101表示,11111101就是-3的补码

    减 3就等于加上 -3 (注意是-3不是3) 的补码, 计算的时要有符号位, 算出来的数也是一个补码, 要恢复成原码看

    例如用8位, 包含1位符号位为例:
    (1)   5 - 3 =2 (可以看做是5加上 -3的补码)
    00000101 + 11111101= 00000010 (正数补码等于原码)

    (2)  3 -5 = -2  (-5 可以用-5的补码表示, 就是11111011)
    00000011 + 11111011 = 11111110(补码) = 10000010 (原码 = -2 )

    如果把公式改写成 - (5-3) 就免去了最后把补码转成原码的过程,只要将结果的符号位取反就行, 因为计算结果是正数, 补码等于原码
    -(00000101 + 11111101 )  = - ( 00000010 ) =  10000010 (原码 = -2 )

    (3) 如果是负数相加, 就转化为正数,例如 -3 -5 = - (3+5)

    展开全文
  • 二进制补码与小数

    2021-06-05 16:46:22
    牛逼的二进制 1.前言 计算机使用二进制来表示所有形式的数据:颜色、文字、图像等。当前辈们想方设法要造一台计算机时都会遇到一个问题:怎么...而补就是用正数表示负数,一个正数的补就是它的负数,所以二进制数与它
  • 二进制数补码及运算

    万次阅读 多人点赞 2019-04-22 12:00:47
    二进制十进制小数部分的转化 1.正数的补码表示 正数的补码 = 原码 负数的补码 = {原码符号位不变} + {数值位按位取反后+1} or = {原码符号位不变} + {数值位从右边第一个1及其右边的0保持不变,左边安位取反...
  • 二进制补码和十进制的转换

    千次阅读 2020-04-03 23:24:58
    先考虑如何将二进制补码转换为十进制整数: 若符号位是0, 则该是正数, 原码等同于补码. 可以由原码(也就是补码)得知代表的正整数. 若符号为是1, 则该一定是负数, 可按照以下方式转换: 方式一: 先把符号位去掉, ...
  • 1、二进制数补码

    2020-12-29 21:02:38
    二进制数补码
  • 二进制补码乘法除法 1)二进制乘法 (1) Binary Multiplication) Binary numbers can be multiplied using two methods, 二进制可以使用两种方法相乘, Paper method: Paper method is similar to multiplication ...
  • 二进制数的反码和补码

    千次阅读 2019-01-16 22:12:54
    在大学的学习中,一开始自认为已经学会了反码与补码,但在看到多种表述之后,...首先从最一般的意义上,分别说一下二进制的反码和补码: 1、反码 1’s complement 把所有的0变为1,所有的1变为0。 如: 10110010 B...
  • 今天一场技术笔试一道编程题难住了我,算出一个十进制二进制补码和对应的16进制,由于时间紧张,加上紧张,做的极差,因此mark以下
  • 二进制数补码及运算(1)

    万次阅读 2017-02-25 22:04:48
    本人研究不深,如有错误请不吝赐教!... = {原码符号位不变} + {数值位从右边第一个1及其右边的0保持不变,左边安位取反} 以十进制整数+97和-97为例: +97原码 = 0110_0001b +97补码 = 0110_0001b -97原码 =
  • 二进制补码计算简单详实的讲解

    千次阅读 2019-02-09 19:08:00
    在回答二进制补码为什么能正确实现加法运算之前,我们先看看它的本质,也就是那两个补码步骤的转换方法是怎么来的。下面描述了一个正数怎么它对应负数在计算机的表达方式。比如128,正数为10000000,但是惊奇的...
  • C++学习记录:将十进制转换为二进制数补码形式) 0、以下操作前提:不动符号位 基本运算: 1、正数的补码 等于 原码; 2、负数的补码 等于 原码取反,末位再加一; 推论: 3、补码补码 等于 原码; 4、反码的...
  • 二进制补码到十进制补码及其内的运算——关于补码的一点学习
  • 二进制 原码 反码 补码

    千次阅读 多人点赞 2019-12-23 17:56:15
    1、原码,反码和补码概念 正数:原码、反码、补码相同; 以123为例: 原码:01111011 反码:01111011 ...--负数的补码即为负数的二进制数。 以-123为例: 原码:11111011,其中最高位1为符号位。 ...
  • 二进制数补码及运算(2)

    千次阅读 2017-02-26 12:04:48
    加法 正数+正数 正数+负数 负数+负数 通过计算可以发现,补码的加法运算可以直接相加,但在有时会产生进位,因此在编写硬件电路时推荐将两个加进行符号位拓展,拓展为位数较多数字的位宽,运算结果预先拓展为该...
  • Python二进制源码补码

    千次阅读 2018-04-25 22:42:57
    假如我的计算机是32位的,接下来要计算~5的值: 5 的二进制表达式为:0000 0000 0000 0000 0000 0000 0000 0101 ...知道一个的“补码”,其值(“源码”)的方法是: 首先看符号位(最左的一位),如果是...
  • 补码 一个学习二进制数补码表示的小项目。 警告:这是一个学习项目,尚未准备好用于生产。
  • 二进制补码转为十进制整数 package kevin.demo; import java.util.Arrays;import java.util.Scanner;public class Hello { public static void main(String[] args) { Scanner in = new Scanner(System.in); String ...
  • 二进制补码数取反的快速方法 简单的对每一位取反,0变1,1变成0,如何对结果进行加1。 一个数和它按位取反结果相加,二进制表示和一定是111····111,即二进制表示为-1. 因此: x + ~x = -1 => x + ~x + 1 =...
  • 一个二进制数中,最高位是符号位,0 为正数,1 为负数。 6 的二进制:0000 0110 8 的二进制:0000 1000 -8 的二进制:1000 1000 如计算: 6 + 8  00000110 +00001000 --------- ...
  • 二进制补码计算原理详解

    万次阅读 多人点赞 2018-07-03 17:34:54
    二进制负数的在计算机中采用补码的方式表示。很多人很好奇为什么使用补码,直接使用原码表示多好,看上去更加直观和易于计算。然而事实告诉我们,这种直观只是我们人类的一厢情愿罢了,在计算机看来,补码才是它们最...
  • 二进制、16进制、补码

    千次阅读 2019-09-11 16:53:33
    二进制 ​ 逢2进1的计数规则 格式:编写时要加0b int 0b //输出2进制: Integer.toBinaryString(); System.out.println(Integer.toBinaryString(n)); //输出10进制: Integer.toString(); System.out....
  • 16进制数(负数)如何求补码

    千次阅读 2021-04-26 21:21:12
    例如数学上,1+(-1)=0,而在二进制中00000001+ 10000001=10000010,换算成十进制为-10,错误。 但是采用他们的补码:00000001+11111111=00000000. 则可以进行正常的直接加减运算。 所以:对于求补码问题。 正数
  • 针对补码这个常见的概念,引申到小数的补码,并且用实例说明其运算规则。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 58,807
精华内容 23,522
关键字:

二进制数的补码怎么求