精华内容
下载资源
问答
  • 什么有反码?为什么补码? 先拿java的int 数据类型是32位,符号的以二进制补码表示的整数;符号位为第一位, 最小值 ,第一位为1,其余为0,-2,147,483,648(-2^31) 最大值 ,第一位为0 ,其余为1,2,...

    目录

    1、前言,自己发明javb语言

    2、模

    3、先思考,为什么不能直接用源码计算

    4、主角的由来

    5、反应肯定是???


     

    最近在学习一下专栏里面的数学问题,提到二进制的东西的时候,想到了大多数人在学习的时候,死记硬背上反码是怎样,补码是怎样。

    现在回头问下自己,反码有何存在意义?补码有何存在意义?为什么要有反码?为什么要有补码?

    1、前言,自己发明javb语言

    先拿java的int 数据类型是32位,有符号的以二进制补码表示的整数;符号位为第一位,
    最小值 ,第一位为1,其余为0,-2,147,483,648(-2^31) 
    最大值 ,第一位为0 ,其余为1,2,147,483,647(2^31-1),是的,int型手机号码都放不下。

    因为位数太长,所以以下说明的时候不太方便,假如我现在发明了了,jbvb语言,接下来整篇分析里面,

    我们把int数据类型设置为4位。有符号的以二进制补码表示的整数;符号位为第一位,
    最小值 ,第一位为1,其余为0,1000,(-2^3)     = -8
    最大值 ,第一位为0 ,其余为1,0111,  ( 2^3 - 1)= 7

    2、模

    取模的除数就是数据类型的上限减去下限的值,再加上 1,也就是 (2^(n-1)-1)-(-2^(n-1))+1=2x2^(n-1)-1+1=2^n-1+1。
    这个除数为什么不直接写成 2^n 呢,这是因为 2^n 已经是 n+1 位了,已经超出了 n 位所能表示的范围。
    其实就是上限到下限的距离。

    那这里的模是2^4 = 16 

    7 + 1 = 0111 + 0001 = 1000 = -8 ,上溢出,超越上限,也就是最大值+1后 会变成最小值。

    还剩15的差值,-8 + 8 能回到0位置, 0+7 能回到7的位置。也就是说 7 + 模后,重新回到原来的位置。

     

    就是余数和取模的概念,这东西周而复始,其实跟时钟类似。

    类似时钟机制,假如现在是6点,顺时针加12个小时,这样就回到了6点。

     

    3、先思考,为什么不能直接用源码计算

    计算机里没有减法,减一个数,相当于加一个数后得到想要的值,然后就在这条路上去探索了。
    1 + (-1) 直接用原码计算是有问题的,还有符号位,所以直接一加是个负数,那这就有问题了。
    所以科学家开始想解决办法了

     

    4、主角的由来

    由前面可知,数值加上模后会回到原来的位置。

    由此将i-j + 模的值等同于 i - j ,   i-j=(i-j)+(2^n-1+1)=i+(2^n-1-j+1)

    2^n-1-j ,结果如下图,

    这个东西刚好是-1,除符号位外的取反。称为反码

     

    2^n-1-j+1,补码,反码加1 

     

    所以-1最终的补码与1相加 ,得到正确的值

     

     

    5、反应肯定是???

    这里的计算算的刚好,这里我看其他人也有相同的迷惑。

    问题一:为什么i-j得加上取模的除数?
    其实这个换个思路理解就行了,i-j是一个值,这个值加上模,其实就还是会回到原来的位置。

    问题二:
    最迷糊的地方来了,2^n-1就是32位1,这个地方就又没有符号位这个说吗吗?

    作者的解答是:我们只考虑(n-1)位的1,不考虑第一位

    一开始其实我也是没太明白这里的解释。
    其实就是回去最原始的地方,我们设定为4位,符号位为第四位,最大值也就2^3-1,现在是2^4,如果是真的符号位 也只是第5位作为符号位。

    现在想必大家都理解了。如果强制加上符号位,那么和j的值是对应不上长度的。所以把第一位去除直接计算。

    这个公式刚好就这么巧解释了整个补码的由来。
     

     

     

     

    展开全文
  • 实际运算中,数是正负的,计算机中的数也正负,通过一个数的最高位表示符号,如果字长为8位,分别为D7-D0,那么D7就是符号位,0表示正数,1表示负数,D6-D0为数值位; 例如: 11010111 = -87 机器数:在...

    首先从计算机中数值数据的编码和表示说起

    机器数和真值

    实际运算中,数是有正负的,计算机中的数也有正负,通过用一个数的最高位表示符号,如果字长为8位,分别为D7-D0,那么D7就是符号位,0表示正数,1表示负数,D6-D0为数值位;

    例如:

    11010111 = -87

    机器数:在计算机中,连同符号一起数码化的数,就被称为机器数;如上面的11010111;

    真值:使用正负号加其绝对值的表示方法的数值;如-87

    原码

    将最高位作为符号位(0表示正,1表示负),其它数字位代表数值本身的绝对值的数字;
     
    如:数字6在计算机中原码表示为:     00000110
         数字 -6 在计算机中原码表示为: 10000110

     

    注意:

    以上是在8位计算机中的原码表示,如果在32位或16位计算机中,表示方法是一样的,只是多了几个0而已.

    但是原码也是有缺陷的

    有了数值的表示方法就可以对数进行算数运算,但是很快就发现用带符号位的原码进行乘除运算时结果正确,而在加减运算的时候会出现问题,如下:

    1 - 1 = 1 + (-1) = 0

    00000001 + 10000001 = 10000010 (-2)

    显然是错误的.

    这时候有人提出了反码

    反码:

    反码表示规则为:如果是正数,则表示方法和原码一样,如果是负数,则保留符号位1,然后将这个数字的原码按照每位取反,则得到这个数的反码表示形式;

    如:数字6在计算机中反码就是他的原码:0000 0110

        数字(-6)在计算机中反码为: 1111 1001

    上文说到了原码的缺陷,在进行减法运算时所得结果与实际结果不相同;

    那么反码就解决了减法运算计算的错误,不过还是存在缺陷,如下:

    1 - 1 = 1 + (-1) = 0

    0000 0001 + 1111 1110 = 1111 1111(-0);有问题

    再看看其他减法是否出错:

    1 - 2 = 1 + (-2) = (-1);

    0000 0001 + 1111 1101 = 1111 1110(-1);正确

    说明反码在进行减法运算时是正确的,只有在结果为0时可能带有负号;

    为什么会出现这样的问题呢?因为反码的表示范围为(-127-(-0)-0-127),总共256个;

    这个问题如何解决?这时候补码出来了!

     补码

    补码是计算机表示数据的一般方式(这句话很重要,圈起来,要考),其规则为:如果是正数,则表示方法和原码一样,如果是负数,则将数字的反码加上1(相当于将原码数值按位取反然后在对地位加1);

    负数的补码就是对反码加一,而正数不变,正数的原码反码补码都是一样的;

    再来检验一下上面的问题:

    1 - 1 = 1 + (-1) = 0;

    0000 0001 + 1111 1111 = 0000 0000;(正确)

    那为什么补码可以这样运算而其他的不行呢,

    在补码中,用(-128)代替了(-0),所以补码的表示范围变成了(-128- 0-127),共256个;

    补码的设计目的

    -使符号位能与有效值部分一起参加运算,从而简化运算规则

    -使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计

    这也就是为什么补码是计算机数据的一般表示方法的原因之一!

     

     
    展开全文
  • 一、为什么需要反码反码的作用就相当于数学中的负数。 对于小学生来说,会做的算术题是:5-3,但是不会做3-5。于是,我们上初中的时候,数学里就引进了一个新的概念:负数。引入负数之后,本来是减法的运算就...

    一、为什么需要反码?

    反码的作用就相当于数学中的负数。

    对于小学生来说,会做的算术题是:5-3,但是不会做3-5。于是,我们上初中的时候,数学里就引进了一个新的概念:负数。引入负数之后,本来是减法的运算就可以变成加法来实现:

    3-5=3+[-5]=[-2],中括号代表“负数”,“负数”就是我们人为给出的数学术语。

    对于计算机来说,会做的算术题是:5+3,但是不会做3-5。于是,我们就在编码里引进了一个新的概念:反码。引入反码之后,本来是减法的运算就可以变成加法来实现:

    3-5=3+[-5]=[-2],中括号代表“反码”,“反码”就是我们人为给出的计算机术语。

    这里,你一定有一个疑问:为什么计算机只会做5+3,不会做3-5。这是因为在计算机的数字电路中只有加法器,没有所谓的“减法器”。不是说计算机厂商不会设计减法器,因为聪明的人既然发明了方法能够用加法来实现减法操作,那为什么还需要画蛇添足的弄一个减法器?

    接着说:那么反码要怎么定义才能实现减法变加法的功能呢?聪明的人想的办法如下:

    1.正数反码保持原码不变:3=[0_0000011]

    2.负数除最高位(正负符号位)外,全部取反(0变1,1变0):-5=1_0000101取反=[1_1111010]

    于是3+[-5]=[-2]的计算过程为:

    [0_0000011]+[1_1111010]=[1_11111101]

    这样,这种反码方法就成功实现了目标!至于为什么,我想只有数学家能给出解释了。

    二、为什么需要补码?

    都是因为“0”这个特殊数字的存在。

    先问你一个问题:0是正数还是负数?你肯定会说:0既不是正数也不是负数,这是我们初中学到的数学知识。这个回答没有问题,所以以后每次碰到0,人们都不会把它当正数或负数。

    那么计算机呢?计算机不同于人脑,计算机在碰到任何数字之前只根据最高位的符号位来判断正负性,“0”表示正数,“1”表示负数。

    前面我们推论了为何要用反码,那么用8位二进制反码表示的正数范围: +0 —— +127;负数范围: -127 —— -0。但是,其中有两个特殊的编码会出现:

    [0_0000000]=+0 (反码)

    [1_1111111]=-0 (反码)

    其实,+0和-0代表的都是0。这样一来,“0”这个数字在计算机中的编码就不是唯一的了。对于计算机来说,这是绝对不行的,因为任何数字都只能有1个编码。

    于是,聪明的人就做了这样一个决定:把0当成正数,也即+0,这样0的编码就变成:0_0000000。那8位二进制表示的正数范围仍然是: +0 —— +127。

    但是,对于负数就必须要做调整,也即-0必须要让位---1_1111111这个编码不能表示-0。我们可以把负数整体向后“挪动1位”:只要将8位二进制表示的负数范围从:-127 —— -0变成:-128 —— -1,就能成功解决问题。

    那么怎么整体挪动1位呢?方法就是反码+1。{1_1111111}编码就不再表示-0,而变成了-1。顺着推,最小的编码{1_0000000}就是-128。

    我们给这个反码+1又人为的取了一个新的名字,叫补码。于是乎,补码的定义如下:

    1.正数补码保持原码不变:3={0_0000011}

    2.负数先求反码,然后再加1:-5=[1_1111010]+1={1_1111011}

    于是3+{-5}={-2}的计算过程为:

    {0_0000011}+{1_1111011}={11111110}

    至此,通过补码就成功解决了数字0在计算机中非唯一编码的问题,且也能实现减法变加法。

    所以,在计算机的世界里,0是正数。这点和我们学的数学不一样。

    {0_1111111}=+127 (补码)

    {0_0000000}=+0 (补码)

    {1_1111111}=-1 (补码)

    {1_0000000}=-128 (补码)

    转载https://zhuanlan.zhihu.com/p/105917577

    展开全文
  • 这个简单的逆向代码让您可以轻松地加密/解密单词。
  • 二进制 原码 反码 补码

    千次阅读 多人点赞 2019-12-23 17:56:15
    1、原码,反码和补码概念 正数:原码、反码、补码相同; 以123为例: 原码:01111011 反码:01111011 补码:01111011 负数的原码:为取绝对值的数转二进制,然后符号位加一; 负数的反码:对该数的原码除符号...

    1、原码,反码和补码概念

    正数:原码、反码、补码相同;

    以123为例:

    原码:01111011

    反码:01111011

    补码:01111011


    负数的原码:为取绝对值的数转二进制,然后符号位加一

    负数的反码:对该数的原码除符号位外,各位取反

    负数的补码:对该数的反码加1。--负数的补码即为负数的二进制数。

    以-123为例:

    原码:11111011,其中最高位1为符号位。

    反码:10000100

    补码:10000101


    2、负数二进制转十进制

    先计算反码:负数二进制码减一,即为反码;
    再计算原码:反码除符号位外,按位取反,即为原码;
    最后计算十进制数:除符号位外的原码转相应的十进制数后,加上负号。

    以-123为例:

    二进制:10000101
    反    码:10000100
    十进制:11111011(原码),去掉符号位原码:1111011,转十进制为:123,加上负号:-123。

    展开全文
  • 反码、补码的作用和意义

    千次阅读 2018-08-07 11:33:15
    https://zhidao.baidu.com/question/536424181.html
  • Integer.MAX_VALUE + 1 == Integer.MIN_VALUE; // true Integer.MIN_VALUE + (-1) == Integer.MAX_VALUE;...机器数是带符号的,在计算机一个数的最高位存放符号,正0负1。 比如十进制数+3 ,如果计算机字长...
  • C语言 原码、反码、补码

    千次阅读 2018-06-25 15:25:51
    C语言 原码、反码、补码一、符号数的编码规则 原码:最高位为符号位,其余各位为数值本身的绝对值。 反码:正数的反码与原码相同;负数的反码,符号位为1,其余位对原码取反。 补码:正数的补码与原码相同;...
  • 本文帮助理解,Java中原码反码补码的原理 1:原码反码补码,基础概念和计算方法 对于一个数,计算机需要使用一定的编码方式进行存储。原码反码补码是计算机存储一个具体数字的编码方式。 原码: 第一位表示符号...
  • 计算机中的信息都是以二进制形式表示的,数值正负之分,计算机就一个数的最高位存放符号(0为正,1为负)。这就是机器数的原码了。设机器能处理的位数为8。即字长为1byte,原码能表示数值的范围为(-127~-0 + 0~127...
  • 什么需要反码和补码 反码 o在计算机的时候,只有加法器没有减法器,为了将减法转换为加法,设计反码; o但是反码有缺陷,正负相加 0 的表示不唯一; 补码 o为了解决反码正负相加不唯一的情况,使用高位溢出解决;
  • 原码、反码、补码是干啥的

    千次阅读 2016-08-15 14:52:57
    原码就是符号位加上真值的绝对值, 即第一位表示符号, 其余位表示值. 比如如果是8位二进制: [+1]原 = 0000 0001 [-1]原 = 1000 0001 2. 反码 反码的表示方法是: 正数的反码是其本身 负数的反码是在其原码的...
  • 原码、反码、补码、移码的作用?  在计算机内,机器数有无符号和带符号数之分。无符号数表示正数,在机器数中没有符号位。位于无符号数,若约定小数点的位置在机器数的最低位之后,则是纯整数;若约定小数点的位置...
  • 由来原码: 所谓原码就是机器数,是加了一位符号位的二进制数(因为数值正负之分),正数符号位为0,负数符号位为1.计算机中存储、处理、运算的数据通常是8位、16位、32位或64位的,这里以最简单的8位为例讲解。注意...
  • 学过计算机原理的人都知道原码、反码、补码,但是多少人知道为什么这三种码呢,这三种码又是用来干嘛的呢。   众所周知,在计算机的世界只有01,那么显然所有的数都得转成二进制,这样计算机才能够理解。...
  • 尽量保证了系统编码的连续性和一致性,同时避免了+/- 0的窘境。 计算机是逻辑严谨的,+/-... (2)反码有两个0; (3) 补码的优点是扩展的时候直接填充最高位(符号位)就行。 https://www.zhihu.com/question/352057791
  • 一:为什么二进制原码反码补码 我们知道,一个数在计算机中使用二进制来表示的。以下都一个字节来表示二进制的存储。例如:+1表示成二进制为00000001,-1表示成二进制为10000001.两个正数相加计算机来十分...
  • 什么原码、反码和补码?

    千次阅读 2018-07-01 11:05:00
    什么原码、反码和补码? 在计算机内,定点数3种表示法:原码、反码和补码 所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。 反码...
  • 计算机底层为什么补码存储,而不用原码或反码? 概念 比特与字节 计算机是依二进制的方式进行存储的,最小的存储单元是“比特(bit)“,或者称作“位“,这是二进制的概念,相对于10进制的就是个十百千万这样的...
  • 计算机用反码,是为了做减法 可以硬件(集成电路)加法器实现。 正数加正数,不用变化,直接送入加法器。 正数加负数: 正数减一个数,等于加原数的负数,等于加它的反码。 负数才有反码。负数才需要有反码。 正数...
  • 计算机中的符号数三种表示方法,即原码、反码和补码。 原码、反码和补码定义: 原码:如果机器字长为n,那么一个数的原码就是一个n位的二进制数,其中最高位为符号位:正数为0,负数为1。剩下的n-1位表示概数...
  • 对于这个算法,很多书上只是说一下思路,没有具体的实现。我在这里举个例子吧
  • 现在我们知道了计算机可以原码 反码 补码这三种编码方式表示一个数,对于正数因为三种编码方式都相同,没有什么好解释的,但是对于负数,负数的原码反码补码是完全不同的,既然原码才是被人脑直接识别并用于计算...
  • 浅谈为什么有反码和补码

    千次阅读 2017-08-18 11:47:45
    背景知识:  正数 的原码,反码和补码都一样  负数的反码为符号位不变,其余位取反  负数的补码为它的反码+1 ...计算机只会加法不会减法,所以两个数的...于是便反码,比如下面的运算 1-1=【00000001】+【1
  • 目录为什么这些编码方式?一、原码二、反码三、补码运算举例1、原码2、反码3、补码 为什么这些编码方式? 计算机在进行运算时,为了提高效率,会把减法改成加上对应负数的方式进行运算。如:1-1会转换为1+...
  • 原码反码补码

    2019-04-23 21:24:55
    原码反码补码
  • 我们经常说:补码=反码+1,但为什么要这样去定义补码呢?补码,反码被早期计算机学家设计出来的目的是什么呢? 下面我们就对上面的问题进行详细解答。 ps:以下的举例都8位二进制。 1.原码的诞生,原码的弊端 ...
  • 【转载】原码 反码 补码 深入理解

    多人点赞 2019-10-12 17:46:08
    前言: 为什么要转载这篇文章? 今天在刷剑指offer的题 ,其中个关键词完全不懂 在网上简单是搜索了一下 还是模棱两可 ...原码 反码 补码 是干什么的 出了有什么用? 原码 反码 补码 原文链接 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,398
精华内容 15,759
关键字:

反码有什么用