精华内容
下载资源
问答
  • 原码反码补码定义

    2019-09-24 11:59:58
    计算机中的数据,其本质都是以二进制码存储。计算机系统的内存储器,是由许多称为字节的单元组成的,1个字节由8个二进制位(bit)构成,每位的取值为0/1。最右端的那1位称为“最低位”,编号为0...例如,+9的原码是...

    计算机中的数据,其本质都是以二进制码存储。计算机系统的内存储器,是由许多称为字节的单元组成的,1个字节由8个二进制位(bit)构成,每位的取值为0/1。最右端的那1位称为“最低位”,编号为0;最左端的那1位称为“最高位”,而且从最低位到最高位顺序,依次编号。

    原码:是最简单的机器数表示法。用最高位表示符号位,‘1’表示负号,‘0’表示正号。其他位存放该数的二进制

    例如,+9的原码是 00001001 

                      └→符号位上的0表示正数

    例如,+9的原码是 00001001 

                     └→符号位上的0表示正数

    反码:

    数值的反码表示分两种情况:

    1、正数的反码:与原码相同。 例如,+9的反码是00001001

    2、负数反码:符号位为1不变,其余各位为该数绝对值的原码按位取反(1变0、0变1)。例如,-9的反码:因为是负数,则符号位为“1”;其余7位为按位取反1110110,所以-9的反码是11110110。

    3、补码:

    补码的表示方法是:

    1、正数的补码就是其本身例如,+9的码是00001001

    2、负数的补码是在其原码的基础上, 符号位1不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

    例如,-9的补码为(11110110+1=11110111)11110111。

     

    转载于:https://www.cnblogs.com/hang-hang/p/11558485.html

    展开全文
  • 原码 反码 补码

    2020-12-20 12:36:09
    这次就来哔哔一下原码 反码 补码这三兄弟吧 此时先定义一个数 int i = 1; 由于实在懒,就不取那么大的数了,1多好,简简单单 原码指的是一个数的二进制表示,那么1就是 00000000 00000000 00000000 00000001 但是,...

    一摸鱼就是好久,主要最近学校期末了,开始各种交大作业,真的伤脑筋
    这次就来哔哔一下原码 反码 补码这三兄弟吧
    此时先定义一个数

    int i = 1;
    

    由于实在懒,就不取那么大的数了,1多好,简简单单
    原码指的是一个数的二进制表示,那么1就是
    00000000 00000000 00000000 00000001
    但是,正数的原码 反码 补码都是一样的,所以。。。例子失败了

    那就换个例子吧
    如果此时给出一串二进制

    11111111 11111111 11111111 11111110

    这个数代表的是多少?

    刚看到的人可能一看,哇,这么多的1,得算到啥时候去,其实不然
    首先我们需要看的是第一位,也就是这个

    11111111 11111111 11111111 11111110

    在二进制中第一位如果是1就代表着是负数,如果是0就代表着正数,不会有人连这个都不知道吧,那你现在就知道咯

    所以这个数其实是个负数,而在进行存储时,负数存储的其实是补码,所以为了知道这串二进制代表的真正是数字是多少,我们还需要把他变成原码才行,也就是说

    11111111 11111111 11111111 11111110

    是这个数的补码

    那么怎么换成原码呢,这里讲一讲原码变成补码的步骤

    首先原码要求反变成反码,随后由反码 +1 变成补码

    感觉有点麻烦的亚子,可是为了c语言设计的方便,就把他设计成了只能进行加运算,负数也只能这么麻烦了,从某些意义上来讲还引起了不错的重视咧

    但是这里要求的是原码,害,数学逆运算嘛

    我们这串二进制是

    11111111 11111111 11111111 11111110

    那首先我们需要把他变成反码,反码变成补码是要 +1
    那我们就 -1

    11111111 11111111 11111111 11111110

    -1


    11111111 11111111 11111111 11111101

    很简单的计算嘛,就是向前借一位,而二进制中前一位的 1 代表着 2 ,所以减完 1 前一位就是 0 ,后一位就是 1 了,逻辑想通了就特别简单,所以

    11111111 11111111 11111111 11111101

    就是这个数的反码

    接下来再给这段二进制求反,你先求反得到了这个,那这个再求反就变回原来的亚子,没毛病吧

    11111111 11111111 11111111 11111101

    求反


    10000000 00000000 00000000 00000010

    注意哦,第一位可不能变的,那是代表着符号的位,不然一个负数就变成正数了

    那此时再来看这个数,会发现这个数竟然只是一个小小的 -2 ,但是存储的时候存了个补码老多 1 了,即

    10000000 00000000 00000000 00000010

    是这个数的原码

    总结一下
    原码 (取反)→反码
    反码(+1)→补码
    负数在进行存储时存的是补码
    正数的原码反码补码都是一样的
    判断正负的时候需要看他二进制的第一位,是0就是正数,是1就是负数
    在进行原码反码补码之间变化取反时第一位的数字是不变的(但是需要注意的是如果直接对数字取反如: ~-2 时符号位需要变化)

    展开全文
  • 原码反码补码定义: 符号位都是用0表示“正”,用1表示“负”。 反码: 正整数的反码 = 原码 负数的反码 = 原码除符号位外的所有位取反 补码: 正整数的补码 = 原码 负数的补码 = 将数字的反码加上1 ...

    题目描述

    输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

     

    原码反码补码定义:

    符号位都是用0表示“正”,用1表示“负”。

    反码:

         正整数的反码 = 原码

         负数的反码  =   原码除符号位外的所有位取反

    补码:

         正整数的补码 = 原码

         负数的补码  =   数字的反码加1

    int类型取值范围: [ -2^31 , 2^31-1] 

    详解参考:  https://blog.csdn.net/y12345678904/article/details/52854230

    2^31 - 1 的原码为  0111 1111 1111 1111 1111 1111 1111 1111

    -2^31     的原码为 1000 0000 0000 0000 0000 0000 0000 0000

    对一个数n,求其反码 :2^31-1 - n 

    # -*- coding:utf-8 -*-
    class Solution:
        def NumberOf1(self, n):
            if n >= 0:
                ans = 0 
            else:
                ans = 1
                n = 2**31 + n  # 反码 + 1
                if n == 0:
                    return 1  # 最小的负数
            for i in range(31):
                ans += n//(2**(30-i))
                n = n%(2**(30-i))
            return ans
    

     

     

     

     

         

     

     

    展开全文
  • 文章目录原码反码补码的详析 及 移位一、原码反码补码定义与 表现形式1.原码2.反码3.补码4.用表格总结,便于记忆!!二、为何使用原码补码反码1.原码的加法2.反码的加法(循环进位)3.补码的加法...

    原码、反码和补码的详析 及 移位

    一、原码、反码和补码的定义与 表现形式

    原码反码与补码是机器存储一个数字的具体编码方式。

    1.原码

    第一位是符号位,其余位表示 数值的绝对值。

    对于1Byte 来说:

    +1 的原码:0000 0001,  0x01
    -1 的原码:1000 0001,  0x81
    

    第一位是符号位,1代表负数,0代表正数。

    1Byte所能表示的整数范围为: [1111 1111, 0111 1111],即 [-127, 127]。

    2.反码

    对于正数,其反码=原码

    对于负数,其反码=除符号位外的原码位取反。

    +1 的反码:0000 0001,  0x01
    -1 的反码:1111 1110,  0xFE
    

    3.补码

    对于正数,其补码=原码

    对于负数,其补码= 反码+1

    +1 的补码:0000 0001,  0x01
    -1 的补码:1111 1111,  0xFF
    

    4.用表格总结,便于记忆!!

    数值(真值) 原码 机器数 反码机器数 补码机器数
    正数 第一位0,其余为数值绝对值 原码 原码
    负数 第一位1,其余为数值绝对值 原码除符号位取反 反码+1
    举例:- 1 0000 0001 0000 0001 0000 0001
    举例:-1 1000 0001 1111 1110 1111 1111

    二、为何使用原码、补码和反码

    原码对于人来说,非常直观,通过第一位判断正负后,通过其他位来计算绝对值。但是对于机器来说,将第一位和其他位区分开来,在程序设计和电路设计上会非常复杂。能否将符号位统一进计算方式中呢?

    实际上,机器计算,只有加法而没有减法,因为减去一个数等于加上该数的负数。

    所以,能否将符号位参与进位运算,且只保留加法运算呢?

    1.原码的加法

    十进制:1 + (-1) = 0

    二进制:0000 0001[原] + 1000 0001[原] = 1000 0010[原] = -2

    让符号位参与运算后,发现原码的计算结果有问题!与十进制的计算方式不对应。

    为了解决这个问题,来看看反码的加法。

    2.反码的加法(循环进位)

    反码的运算规则:

    1. 反码运算时,其符号位与数值一起参加运算。

    2. 反码的符号位相加后,如果有进位出现,则要把它送回到最低位去相加(循环进位)

    3. 用反码运算,其运算结果亦为反码。在转换为真值时,若符号位为0,数位不变;若符号位为1,应将结果求反才是其真值。(这里求反不包括符号位)

    十进制:1 + (-1) = 0

    二进制:0000 0001[反] + 1111 1110[反] = 1111 1111[反] = 1000 0000[原] = -0

    数值是对了,但是是 -0 ,0的话,原则上是没有正负区分的,0加上符号之后也没有什么意义。

    除此之外,两种编码 0000 0001[原] + 1000 0000[原] 都表示了0,造成了浪费。

    十进制:-1 + (-127) = -128, -128超出了原码(反码)的表达范围,溢出变为126,不对

    二进制:1111 1110[反] + 1000 0000[反] = 0111 1111[反] = 0111 1111[原] = 127

    3.补码的加法(舍弃进位)

    补码的运算规则:

    两个机器数相加的补码可以先通过分别对两个机器数求补码,然后再相加得到,在采用补码形式表示时,进行加法运算可以把符号位和数值位一起进行运算(若符号位有进位,导致了溢出,则直接舍弃,注意这里和反码加法计算的区别),结果为两数之和的补码形式。

    补码的出现,解决了0的多编码问题。

    十进制:1 + (-1) = 0

    二进制:0000 0001[补] + 1111 1111[补] = 0000 0000[补] = 0000 0000[原] = 0

    那多出来的 1000 0000[补] 来表示谁呢?答案是 -128

    -127 的 原码、反码和补码分别是:1111 1111[原] 1000 0000[反] 1000 0001[补]

    十进制:-1 + (-127) = -128

    二进制:1111 1111[补] + 1000 0001[补] = 1000 0000[补]

    在这里,用1000 0000[补]来表示-128 的补码,虽然按照前一节的定义, 1000 0000[补] 对应的原码是 0000 0000[原],但这里不这么对应。所以,-128 只有补码,没有原码和反码。

    考虑符号位时,原码的表示范围为[-127, 127], 采用补码后,将 -0 变为表示 -128,这样补码的表示范围就是 [-128, 127],多保存了一个最小值。

    4. 32位int的表示范围 [-2147483648, 2147483647]

    对于具有32bit位的int,

    其最小值为:-2147483648 = -2^31,其补码为 0x8000 0000

    其最大值为:-2147483647=2^31-1,其补码为 0x7FFF FFFF

    对-2147483648取负值时,按理论应该是2147483648,但超过int能表达的最大正值,相当于2147283647+1=0111…1111+0000…0001=1000…0000=-2147483648(按补码理解)。也就是说对-2147483648取负仍然是-2147483648。

    对-2147483648-1时,相当于1000…0000+1111…1111(-1的补码)=0111…1111(溢出后)=2147483647(int的最大正值)

    三、反码的数学理论深入

    3.1取模同余

    以时针钟表为例,时间是12进制,如果当前是5点,希望设置为2点,该怎么调整钟表,下面有两种方法:

    1. 时针往回拨3小时,5-3=2
    2. 时针往前拨9小时,5+9=14, 14 mod 12=2

    mod 指的是取模操作,14针对12的余数是2。

    可以看到时针往回拨的减法操作可以用往前拨的加法操作替代。

    同余的概念:

    两个整数a, b,若他们除以整数m的余数相同,则成它俩对于模 m 同余。

    对于时钟,3mod12=3, 15mod12=3。 3和15对于模12同余。

    正数取余概念很容易,那么负数怎么取模呢?

    负数的取模:

    x mod y = x - y * floor( x / y )

    -3 mod 2 = -3 - 2 * floor(-3/2) = -3 - 2 * (-2) = -3 +4 = 1

    -5 mod 12 = -5 - 12 * floor(-5/12) = -5 - 12 * (-1) = 12- 5 = 7

    -3 mod 12 = -3 - 12 * floor(-3/12) = -3 - 12 * (-1) = 12 -3 = 9

    因此:减法转加法,相当于 找到 负数 的同余 正整数。

    对于时针问题,5-3=2, 5+9=14mod12=2

    -3 mod 12 = 9。 -3 和 9 是同余!

    3.2反码的同余

    下面看看反码和同余有什么关系。

    拿 2 - 1来看,反码符号位参与运算,符号位进位后,循环加到最末一位:

    2 - 1 = 2 + (-1) = [0000 0010]原 + [1000 0001]原 = [0000 0010]反 + [1111 1110]反 = [0000 0001]反 = 1

    反码的计算结果是正确的。

    在这里,关注的是 [0000 0010]反 + [1111 1110]反 ,因为正数的反码还是原码,如果在这里,将[1111 1110]反 除符号位之外的位看做是原码,则 -1 的反码表示的就是 126(除符号位)。

    恰恰,126 mod 127 = 126 -1 mod 127 = 126

    126 和 -1 同余,所以 2-1 和 2+126的余数是相同的。 都是正确结果1。

    所以一个数的反码,相当于对于一个模的同余数,该模就是二进制所能表示的最大值。

    像钟表一样,翻转一圈后找到正确的数值。

    3.3补码的意义所在

    既然反码已经实现了减法变加法,那补码的意义何在呢?上一节说了,利用补码,可以增加一个数的表达 -128,同时0的编码方式也只有一种。

    补码是反码加1。反码加1之后,为何还是可以得到正确的结果?

    再来看 2 -1 的情况:

    2 - 1 = 2 + (-1) = [0000 0010]原 + [1000 0001]原 = [0000 0010]反 + [1111 1110]反

    = [0000 0010]补 + [1111 1111]补 = [0000 0001]补 = 1

    在这里,如果把 -1 的 [1111 1111]补 看成是 原码(除符号位),则 表示 127。

    其实,补码就是在反码的基础上,增加了 模 的值。

    在反码中,模为127,在补码中模为128。

    用补码表示的运算结果最小值和最大值应该是[-128, 128],但是由于0的特殊情况, 没有办法表示128, 所以补码的取值范围是[-128, 127]。

    四、二进制运算

    与或异或

    与 & 或 | 异或 ^
    0&0=0 0|0=0 0^0=0
    0&1=0 0|1=1 0^1=1
    1&0=0 1|0=1 1^0=1
    1&1=1 1|1=1 1^1=0

    左移

    m<<n,表示把m左移n位。最左边的n位将被丢弃,右边补上n个0;

    00001010<<2 = 00101000

    10001010<<3 = 01010000

    右移

    m>>n,表示把m右移n位。右移的时候,右边的n位将被丢弃,左边补位的时候,要分情况。

    1. unsigned 无符号,补0
    2. signed,有符号,用符号位补。如果原来是正数,就补0,原来是负数,就补1.

    00001010>>2 = 00000010

    10001010>>3 = 11110001

    总结:

    左移时总是移位和补零;

    右移时无符号数是移位和补零,此时称为逻辑右移;

    而有符号数大多数情况下是移位和补最左边的位(也就是补最高有效位),移几位就补几位,此时称为算术右移。

    参考文章

    • https://www.cnblogs.com/huangjianwu/p/4549085.html
    • https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html
    • https://blog.csdn.net/qq_41376345/article/details/80536654?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
    展开全文
  • 定义有符号数据的表示法: 原码反码补码原码: 二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。所以 原码有两部分组成 : 符号位 数值例子: 原码反码补码 ...
  • 关于原码反码补码

    2018-10-07 10:03:00
    下面是了解原码补码反码之后做出的小小的总结: 原码的出现是为了计算机更加容易的进行数据之间的计算而出现的以二进制形式表现的编码方式。其以八位数表示,为了计算机计算更加简单,将编码的第一位定义为符号位...
  • 原码 反码 补码 移码

    2015-05-11 16:30:00
    最近在备战软考,复习到计算机组成原理的时候,看到书中关于原码反码补码和移码的定义如下(n是机器字长): 原码反码补码: 移码: 看完这些定义以后,我的脑袋瞬间膨胀到原来的...
  • 反码:正数的反码原码相同,负数的反码原码的取反 最高位不变。 补码:正数补码原码相同。负数的补码原码进行加1。 溢出:在数据进行操作的时候会导致超出数据类型大小,会向前位进1,多于原始数据类型...
  • 此篇文章主要是知道计算机底层存的是补码。进制转换的话,Java提供了很多方法。 1、二进制: Java整数的常量默认是int类型,当用二进制定义整数时,其第32位...结论2:正数的原码反码补码都相同 负数的补码是其
  • 原码反码补码定义原码:如果机器字长为n,那么一个数的原码就是用一个n位的二进制数,其中最高位为符号位:正数为0,负数为1。剩下的n-1位表示概数的绝对值。 正数:二进制表示 例:7:0000 0111 零: 零...
  • 上文「原码 反码 补码 移码」一探究竟(一)说了基本定义原码,对于补码,我们只知道是对原码符号位不变,其他位置取反,最后再加 1 得来的,为何如此呢?接下来咱们来揭下「补码」的面具,看看它到底是什么。 0. ...
  • 原码 反码 补码 阶码 看收藏 字符编码是人为定义的一套转换,规定了一系列的文字对应的二进制。 字符编码涉及到编码和解码两个过程,编码和解码的时候必须采用同一套字符编码,不然会出现乱码。 字符编码的发展过程...
  • NOIP考试题型:进制转换;字节转换;反码补码;以及数据类型的定义等基础知识
  • 注:在java语言中,一个java文件只能定义一个被public修饰的类,且被public修饰的类名,必须和java文件的文件名相同。 ············································...
  • 先来回顾一下移码是什么,简单说定义就一句话:**将补码符号位取反,即为移码。**乍一看,是不是有点懵,这到底在说什么呢?什么是移码?为什么是这么算?它能干嘛用?莫急,这些问题一个一个都会解决。 相比于移码...
  • 原码,是一种计算机中对数字的二进制定点表示方法。一般分为两种,有符号位和无符号位。 有符号位,即用最高位的 bit 位来表示正负,剩下的位来存储数据;无符号位,即所有的 bit 位都来表示数据,所以无符号数字...
  • 原码反码补码和移码其实很简单

    万次阅读 多人点赞 2012-04-05 21:08:32
    最近在备战软考,复习到计算机组成原理的时候,看到书中关于原码反码补码和移码的定义如下(n是机器字长): 原码反码补码: 移码: 看完这些定义以后,我的脑袋瞬间膨胀到原来的...
  • 原码反码补码

    2020-09-09 09:21:56
    多的细节就不说了,直接记录一下怎么定义的,这东西不难,但不总结容易忘。 原码:最高位是符号位,其余各位为数值本身的绝对值 反码:  正数:反码原码相同  负数:符号位为1,其余位对原码取反 补码:  正数...
  • 原码反码补码

    2018-10-04 15:49:22
    文章目录原码反码补码常见问题原码、反码、补码出现的原因,计算上的应用参考文献 原码反码补码 原码 反码 补码 定义 人类用来表示有符号数数值的二进制形式 把符号位参与运算,解决原码做减法的问题...
  • 关键字(keyword)的定义和特点 定义:被Java语言赋予了特殊含义,用作专门用途的字符串(单词) 特点:关键字中的所有字母都为小写 注意:严格意义来讲,true和false和null不算是关键字,但是可以被当作关键字...
  • 原码补码反码详解本篇文章讲解了计算机的原码, 反码补码. 并且进行了深入探求了为何要使用反码补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法。一. 机器数和真值在学习原码, 反码和补...
  • 正数、负数求原码反码补码

    万次阅读 2018-04-13 16:39:44
    无符号数的原码反码补码都一样,皆为该数的二进制表示法 原码 反码 补码 定义 无符号数的原码为该数的二进制表示法 无符号数的反码原码一样 无符号数的补码原码一样 ...
  • 原码补码反码

    2015-07-18 21:31:52
    原码,补码,反码bit BYTE WORD DWORD 1 BYTE = 8 bit 1 WORD = 2 BYTE 1 DWORD = 2 WORD原码 定义:将最高位做为符号位(0代表正,1代表负),其余各位代表数值...定义:正数:原码反码补码都相同;负数:最高
  • 101010 四、原码反码补码定义 1、计算机中的数据 0表示正数,1表示负数,那么0与1也表示数据值,那我们怎么判断他是数据值还是符号位呢? 答:规定第一位为符号位 2、原码表示法,原码就是数值的二进制数。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 482
精华内容 192
关键字:

原码反码补码定义