精华内容
下载资源
问答
  • #include <iostream> #include <math.h> #include <string.h> using namespace std;...void ten2two(int ten,char ... //十进制转二进制,且最高位为符号位 int ten1 = abs(ten); int i=0; ...
    
    #include <iostream>
    #include <math.h>
    #include <string.h>
    using namespace std;
    void ten2two(int ten,char data[100]){
        //十进制数转二进制数,且最高位为符号位
        int ten1 = abs(ten);
        int i=0;
        while(ten1>0){
            data[i++] = ten1%2+'0';
            ten1/=2;
        }
        if(ten>0)
            data[i] = '0';
        else
            data[i] = '1';
    }
    void out(char *data){
        for (int i = strlen(data)-1; i >= 0; --i)
            cout << data[i] ;
        cout << endl;
    }
    void Turn_fan(char *data){  
    	//求二进制数的反码
        if(data[strlen(data)-1]=='0')
            return;
        else{
            for (int i = strlen(data)-2; i >=0 ; --i)
                if(data[i]=='0')
                    data[i] = '1';
                else if(data[i]=='1')
                    data[i] = '0';
            return ;
        }
    }
    void Turn_bu(char *data){
    	//求二进制数的补码
        if(data[strlen(data)-1]=='0')
            return ;
        else {
            for (int i = 0; i < strlen(data)-1; ++i) {
                if(data[i]=='1')
                    data[i] = '0';
                else{
                    data[i] = '1';
                    return ;
                }
            }
        }
    }
    int main(){
        int ten;
        char data[100];
        cin >> ten;
        ten2two(ten,data);
        cout << ten << "的原码为: " ;
        out(data);
        Turn_fan(data);
        cout << "反码为:";
        out(data);
        Turn_bu(data);
        cout << "补码为:" ;
        out(data);
        return 0;
    }
    
    展开全文
  • 本文参考:https://blog.csdn.net/wn084/article/details/79963979原码: 所谓原码就是机器,是加了一位符号位二进制(因为数值有正负之分),正数符号位为0,负数符号位为1.计算机中存储、处理、运算数据通常...

    本文参考:https://blog.csdn.net/wn084/article/details/79963979
    原码:
    所谓原码就是机器数,是加了一位符号位的二进制数(因为数值有正负之分),正数符号位为0,负数符号位为1.
    计算机中存储、处理、运算的数据通常是8位、16位、32位或64位的,这里以最简单的8位为例讲解。
    注意符号位是包含在8位中的其中1位,故可直观读出的数只有7位(只有后7位数可以按权展开)。
    求原码的方法:
    正数:
    将一个十进制正整数转换二进制数(带符号位), 即是这个数的原码.
    负数:
    先计算该负数绝对值的二进制。之后对其每个数"取反,然后加一。
    比如-32
    第一步:32(10)= 00100000(2)
    第二步:求反:11011111
    第三步:加1:11100000


    反码:

    由来: 用带符号位的原码进行乘除运算时结果正确,而在加减运算的时候就出现了问题,如: 用十进制表示:1 + (-1) = 0,
    但用二进制表示:00000001 + 10000001 = 10000010, 将结果换算成十进制数也就是-2.
    于是就发现问题出现在带符号位的负数身上为了解决二进制中正负数的加减问题,人们就在原码的基础上发明了反码,
    反码的表示方式是用来处理负数的,符号位置不变,其余位置相反.
    反码的取值空间和原码相同且一一对应.
    所以1 + (-1) = 0, 用二进制就可以表示为:00000001 + 11111110 = 11111111, 在反码的表示形式中,11111111表示-0,所以就可以解决"二进制正负数相加等于0"的问题
    求反码的方法是:原码取反后就是反码,正数不变,负数保留符号位1不变,剩下位按位取反. (1变0,0变1)

    补码:

    由来:虽然反码的出现解决了正负数的加减问题, 但却让0这个数字有了两种"形态": "0"和"-0", 但这是不合逻辑的,只应该有一个0,所以人们就又发明了补码.
    在反码的基础上补一位就得到了补码, 但有失必有得, 需要丢掉最高位. 如反码中的"-0"表示为11111111, 补上一个1后为100000000, 将最高位的1去掉,就剩下
    00000000.跟正数的0完美融合, 这样就解决了"0"和"-0"的问题.(人类的智慧是伟大的...)
    下面再通过"正负数相加等于零"的问题来验证一下补码是否可用:
    3 + (-3) = 0, 二进制表示: 00000011 + 11111101("-3"的补码) = 100000000, 去掉最高位并将结果换算成十进制: 0, 问题彻底解决.
    求补码的方法:在反码的基础上补一个1.

    转换方法:

    分正数和负数
    正数:
    正数的原码与反码,补码都相同.

    负数:
    原码转反码: 符号位不变,其余位取反.  如: -6的原码为:10000110, 反码为11111001.
    反码转补码: 直接补1即可. 如: -5的反码为:11111010, 补码为11111011.
    原码转补码: 符号位不变,其余各位取反后补1, 也就是反码补1.
    补码转原码: 退1后,除符号位各位取反.或先计算该负数绝对值的二进制。之后对其每个数“取反”,然后加一。

    思考:java中为什么byte的取值范围是-128~127.

    解释: java中byte占一个字节, 也就是8bit(位), 其中最高位是符号位, 剩下7位用来表示数值.若符号位为0, 则表示为正数,范围为00000000~01111111(补码形式),
    也就是十进制的0-127. 若符号位为1, 则表示为负数, 范围为10000000~11111111(补码形式), -128~-1, 11111111转换为原码就是10000001,也就是-1.
    在补码中,为了避免存在"-0",规定10000000为-128, 所以解释了byte的取值范围为什么是-128~127.

    总结:

    1. 计算机中的整数都是以补码的形式储存的,为的就是使计算机对整数的减加乘除操作不会出错. 2. 为了消除"-0",规定补码"10000000"为十进制的"-128".
    3.(-128)没有相对应的原码和反码, (-128) = (10000000).

    转载于:https://www.cnblogs.com/summerdata/p/10722359.html

    展开全文
  • 由来原码: 所谓原码就是机器数,是加了一位符号位的二进制数(因为数值有正负之分),正数符号位为0,负数符号位为1...求原码的方法: 正数:将一个十进制正整数转换二进制数(带符号位), 即是这个数的原码.负数:先计算该...

    由来

    原码:
    所谓原码就是机器数,是加了一位符号位的二进制数(因为数值有正负之分),正数符号位为0,负数符号位为1.
    计算机中存储、处理、运算的数据通常是8位、16位、32位或64位的,这里以最简单的8位为例讲解。
    注意符号位是包含在8位中的其中1位,故可直观读出的数只有7位(只有后7位数可以按权展开)。
    求原码的方法:
    正数:
    将一个十进制正整数转换二进制数(带符号位), 即是这个数的原码.
    负数:
    先计算该负数绝对值的二进制。之后对其每个数"取反,然后加一。
    比如-32
    第一步:32(10)= 00100000(2)
    第二步:求反:11011111
    第三步:加1:11100000


    反码:

    由来: 用带符号位的原码进行乘除运算时结果正确,而在加减运算的时候就出现了问题,如: 用十进制表示:1 + (-1) = 0,
    但用二进制表示:00000001 + 10000001 = 10000010, 将结果换算成十进制数也就是-2.
    于是就发现问题出现在带符号位的负数身上为了解决二进制中正负数的加减问题,人们就在原码的基础上发明了反码,
    反码的表示方式是用来处理负数的,符号位置不变,其余位置相反.
    反码的取值空间和原码相同且一一对应.
    所以1 + (-1) = 0, 用二进制就可以表示为:00000001 + 11111110 = 11111111, 在反码的表示形式中,11111111表示-0,所以就可以解决"二进制正负数相加等于0"的问题
    求反码的方法是:原码取反后就是反码,正数不变,负数保留符号位1不变,剩下位按位取反. (1变0,0变1)

    补码:

    由来:虽然反码的出现解决了正负数的加减问题, 但却让0这个数字有了两种"形态": "0"和"-0", 但这是不合逻辑的,只应该有一个0,所以人们就又发明了补码.
    在反码的基础上补一位就得到了补码, 但有失必有得, 需要丢掉最高位. 如反码中的"-0"表示为11111111, 补上一个1后为100000000, 将最高位的1去掉,就剩下
    00000000.跟正数的0完美融合, 这样就解决了"0"和"-0"的问题.(人类的智慧是伟大的...)
    下面再通过"正负数相加等于零"的问题来验证一下补码是否可用:
    3 + (-3) = 0, 二进制表示: 00000011 + 11111101("-3"的补码) = 100000000, 去掉最高位并将结果换算成十进制: 0, 问题彻底解决.
    求补码的方法:在反码的基础上补一个1.

    转换方法:

    分正数和负数
    正数:
    正数的原码与反码,补码都相同.

    负数:
    原码转反码: 符号位不变,其余位取反.  如: -6的原码为:10000110, 反码为11111001.
    反码转补码: 直接补1即可. 如: -5的反码为:11111010, 补码为11111011.
    原码转补码: 符号位不变,其余各位取反后补1, 也就是反码补1.
    补码转原码: 退1后,除符号位各位取反.或先计算该负数绝对值的二进制。之后对其每个数“取反”,然后加一。

    思考:java中为什么byte的取值范围是-128~127.

    解释: java中byte占一个字节, 也就是8bit(位), 其中最高位是符号位, 剩下7位用来表示数值.若符号位为0, 则表示为正数,范围为00000000~01111111(补码形式),
    也就是十进制的0-127. 若符号位为1, 则表示为负数, 范围为10000000~11111111(补码形式), -128~-1, 11111111转换为原码就是10000001,也就是-1.
    在补码中,为了避免存在"-0",规定10000000为-128, 所以解释了byte的取值范围为什么是-128~127.

    总结:
    1. 计算机中的整数都是以补码的形式储存的,为的就是使计算机对整数的减加乘除操作不会出错.
    2. 为了消除"-0",规定补码"10000000"为十进制的"-128".
    3.(-128)没有相对应的原码和反码, (-128) = (10000000).

    本文参考:
    https://www.cnblogs.com/huangyb-blog/p/5684305.html
    https://www.zhihu.com/question/20159860/answer/21113783 的第二个回答

    展开全文
  • 相当于人大脑.运算中心,控制中心. 内存: 临时存储数据.优点:读取速度快,缺点:容量小,造价高,断电即消失. 硬盘: 长期存储数据.优点:容量大,造价相对低,断电不消失,缺点:读取速度慢. 操作系统:统一管理计算机软...

    一:计算机硬件基本认知

    cpu:   中央处理器.   相当于人的大脑.运算中心,控制中心.

    内存:  临时存储数据. 优点:读取速度快,缺点:容量小,造价高,断电即消失.

    硬盘:  长期存储数据. 优点:容量大,造价相对低,断电不消失,缺点:读取速度慢.

    操作系统:统一管理计算机软硬件资源的程序

     

    二: 计算机文件大小单位

    b = bit  位(比特)

    B = Byte 字节

    1Byte = 8 bit   #一个字节等于8位  可以简写成 1B = 8b

    1KB = 1024B

    1MB = 1024KB

    1GB = 1024MB

    1TB = 1024GB

    1PB = 1024TB

    1EB = 1024PB

     

    三:进制转换

    二进制:由2个数字组成,有0 和 1     例:  0b101

    八进制:由8个数字组成,有0,1,2,3,4,5,6,7        例:  0o127  

    十进制:有10个数字组成,有0,1,2,3,4,5,6,7,8,9   例:  250

    十六进制:有16个数字组成,有0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f(字母大小写都可以,分别代表10,11,12,13,14,15) 例:0xff  0Xff  0XFF         

     

    1.其他进制转十进制

    (1)二进制 转化成 十进制:

    例: 0b10100101  

    运算:1* 2^0 + 0* 2^1 + 1* 2^2 + 0* 2^3 + 0* 2^4 + 1* 2^5 + 0* 2^6 + 1* 2^7=

    1 + 0 + 4 + 0 + 0 + 32 + 0 + 128 = 165

    (2)八进制 转化成 十进制:

    例: 0o127

    运算:7*8^0 + 2*8^1 + 1*8^2 = 7+16+64 = 87

    (2) 十六进制 转化成 十进制:

    例: 0xff

    运算:15*16^0 + 15*16^1 = 255

     

    小练习: 转化成十进制

    0b11010110  #214

    0b01110101  #117

    0o234       

    0o171

    0x123

    0x1c2

    2.十进制转成其他进制

    (1)十进制 转化成 二进制:

    426 => 0b110101010  

    运算过程:   用426除以2,得出的结果再去不停地除以2,

    直到除完最后的结果小于2停止,

    在把每个阶段求得的余数从下到上依次拼接完毕即可

    (2)十进制 转化成 八进制:

    426 => 0o652

    运算过程:   用426除以8,得出的结果再去不停地除以8,

    直到除完最后的结果小于8停止,

    在把每个阶段求得的余数从下到上依次拼接完毕即可

    (3)十进制 转化成 十六进制:

    运算过程:   用426除以16,得出的结果再去不停地除以16,

    直到除完最后的结果小于16停止,

    在把每个阶段求得的余数从下到上依次拼接完毕即可

    小练习: 转化成对应进制

    723 => 2

    654 => 2

    723 => 8  

    654 => 8

    723 => 16

    654 => 16

    3.二进制与八进制转换

    二进制与八进制对应关系:

    八进制  二进制

    0 000

    1 001

    2 010

    3 011

    4 100

    5 101

    6 110

    7 111

    ```

     

    ```

    例:1010100101

    八进制:从右向左 3位一隔开 不够三位用0补位 变成:

    001 010 100 101

    0o   1    2   4   5

    ```

    4.二进制与十六进制转换

    ```

    十六进制  二进制

    0   0000

    1   0001

    2   0010

    3   0011

    4   0100

    5   0101

    6   0110

    7   0111

    8   1000

    9   1001

    a   1010

    b   1011

    c   1100

    d   1101

    e   1110

    f   1111

    ```

    ```

    例:1010100101

    十六进制:从右向左 4位一隔开 不够四位用0补位 变成:

    0010 1010 0101

    0x2a5

    5.八进制 与 十六进制的转换

    先转换成二进制 再去对应转换

    比如:0x2a5 转换成 1010100101 再转8进制 0o1245

    ### 小练习: 转化成对应进制

    0x1DD => 8

    0x29a => 8

    0o573 => 16

    0o336 => 16

    四:原码 反码 补码   

    1.概念  

    计算机的所有数据在底层都是以二进制的[补码]形式存储

    实际人们看到的数字是[原码]转化来的

    而[原码]是通过[补码]得到的

    补码 ->  原码 -> 最后人们看到的数

    ***进制转换的时候需要先把内存存储的补码拿出来变成原码在进行转换输出***

     

    正数高位补0  负数高位补1(前面空白位全是1)

        数字1   00000000 1  正数高位都补0

        数字-1  11111111 1  负数高位都补1

     

    原码: 用来转换对应进制

    反码: 二进制码0变1,1变0叫做反码,反码用于原码补码之间的转换.(符号位不变)

    补码: 用来做数据的存储运算. 补码提出的根源是让计算机底层的实现减法操作(可以表达出一个数的正负)

    言外之意:计算机默认只会做加法,例:5+(-3)  => 5 - 3

    乘法除法:是通过左移和右移 << >> 来实现

     

     2.运算

    (原码 反码 补码之间的转换 , 符号位不要动)

    正数: 原码 = 反码 = 补码

    负数: 原码 = 补码取反加1   给补码求原码

    负数: 补码 = 原码取反加1   给原码求补码

     

    小练习:

    #给原码求补码

    -6 的补码是多少?

    原码为: 1  0000...00000110

    反码为: 1  1111...11111001

    补码为: 1  1111...11111010

    6  的补码是多少?

    6是整数原码和反码和补码相同得:

    补码为:0 0000...00000110

    10 的补码是多少?

    补码为:0 0000...00001010

       -10 的补码是多少?

    原码为:1 0000...00001010

    反码为:1 1111...11110101

    补码为:1 1111...11110110

         9 的补码是多少?

        补码为:0 0000...00001001

    -9 的补码是多少?

    原码为:  1 0000...00001001

    反码为:1 1111...11110110

    #给补码求原码

    1 ... 111  00011 (高位都是1)

    1 ... 111  0110010 (高位都是1)

    # 9+(-5) 用二进制相加运算一下

     

    5-3 运算结果 (用二进制的形式表达)

    5 + (-3) => 5 - 3

    5  => 101

    -3 => ?

     

    (1) 先算-3的原码

    1  0000...000  011

    (2) 取反

    1  1111...111  100

    (3) 加1  最终值是补码 (用来做算术运算或存储用的)

    1  1111...111  101

     

     

    5  => 0 0000...000 101

    -3 => 1 1111...111 101

     

    2  => 0..0000 ..   010

    #(1) 正数的原码 反码 补码 全都一样

    因为高位时0  所以不需要再用补码取反+1 得到原码了,直接转换即可.

     

     

    -5+3

    -5 => ?

    (1) 先算-5的原码

    1 0000.0000 101

    (2) 取反

    1 1111.1111 010

    (3) 加一

    1 1111.1111 011

    3 => ?

    (1) 原码

    0 0000.0000 011

    因为是正数 所以原码和补码相同,不需要再转换了

     

    用补码运算:

    1 1111.1111 011

    0 0000.0000 011

    1 1111.1111 110

     

    得到一个补码(负数)

    给补码求原码:

    # 取反

    1 0000.0000 001

    # 加一 (原码)

    1 0000.0000 010

    -2

     

    ******

    #最终进制转换用的是原码

    #做算数运算或存储用补码

    展开全文
  • 本篇文章讲解了计算机的原码, 反码补码. 并且进行了深入探求了为何要使用反码补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家...
  • 机器 真值 原码 反码 补码

    万次阅读 多人点赞 2016-10-23 18:41:32
    机器 真值 原码 反码 补码的概念和详细讲解
  • 机器原码反码补码基本概念字在计算机中,一串数码作为一个整体来处理或运算,称为一个计算机字,简称字。字通常分为若干个字节(每个字节一般是8位)。在存储器中,通常每个单元存储一个字,因此每个字都是可以...
  • 机器原码反码补码基本概念字在计算机中,一串数码作为一个整体来处理或运算,称为一个计算机字,简称字。字通常分为若干个字节(每个字节一般是8位)。在存储器中,通常每个单元存储一个字,因此每个字都是可以...
  • [-3]反=[10000011]反=11111100 原码 反码 负数的补码是将...我们可以采取逆过程先减1,.(1)原码表示法 原码表示法是机器数的一种简单的表示法。其符号位用0表示正号,用:表示负号,数值一般用二进制形式表示。设有一...
  • 原码反码补码

    2020-06-30 19:05:36
    原码 反码 补码 对计算机中常见数据简单分类 机器 与 真值 原码 反码 补码 扩展 对计算机常见数据分类 机器 就是数值在计算机中二进制表现形式 机器在计算机中有符号,使用 最高位表示符号 , 使用0 表示...
  • 原始博文网址,无意侵权,只是想记下来以后复习的时候方便, ... ... 机器数 一个数在计算机中的二进制表示形式,叫做这个数的机器数,机器数是带符号的,在计算机中用一个数的...
  • 原码 反码 补码

    2020-12-20 12:36:09
    一摸鱼就是好久,主要最近学校期末了,开始各种...但是,正数的原码 反码 补码都是一样的,所以。。。例子失败了 那就换个例子吧 如果此时给出一串二进制 11111111 11111111 11111111 11111110 这个代表的是多少?
  • 在学习原码, 反码补码之前, 需要先了解机器数和真值的概念. 1、机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十...
  • 前言:学计算机的第一个接触的知识就是原码反码补码,不自觉得会认为这个很简单,但是现在让你算一个数的原码反码补码真的会吗?让你算两个补码之和会算吗?今天看计算机组成原理,书中又提到了这些知识,就顺便总结一下. ...
  • 原码 反码 补码的相互转换 原码 反码 补码的转换 还是比较 简单基础问题。之前学习java时候就学过,后来忘记了,忘记了!!!,后来学了位移运算符,左移 右移 无符号右移 之后就由有点儿懵了。 原码反码,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,446
精华内容 1,778
关键字:

数的原码反码补码