精华内容
下载资源
问答
  • 原码、反码和补码
    千次阅读
    2022-05-10 09:26:30

    其实对于计算机来说,并不存在原码和反码,计算机存储的二进制数据都是以补码的形式存放的,自然对数据的运算也是直接用补码来运算(计算机中只有加法器没有减法器)

    我们都知道正整数(包括0)的补码是它本身,负整数的补码是它的原码非符号位取反再加一

    先来看个例子1:

    十进制整数二进制原码二进制补码
    701110111
    -511011011

    所以我们当计算机要计算7-5=?,实际上计算机直接认为是7+(-5)=?, 所以计算机把存储的7和-5对应的补码拿过来直接相加 0111+1011=0001 0010 ,我们看到数据溢出了,不过只要看后四位就行!我们要清楚计算所得的0010是直接存储在计算机中的!所以0010本质上来说是最终计算结果所对应二进制的补码(补码+补码=补码)。也就说我们要将0010这个补码逆推回所需要的原码,后四位0010的高位为0,显然是正数,那么0010这个补码对应的原码依然是0010!0010转换为十进制是2,7-5=2成立!

    再来看个例子2:

    十进制整数二进制原码二进制补码
    70000 01110000 0111
    -81000 10001111 1000

    7-8=7+(-8)=? ---> 0000 0111 + 1111 1000=1111 1111 ,这次我们发现得到1111 1111 这个补码的高位是1,这就表明该补码对应的原码是一个负数。

    对于负整数来说:补码=(原码)取反+1,那么原码=(补码-1)取反,注意取反时符号位不变!

    1111 1111 -0000 0001=1111 1110 --->取反---> 1000 0001,很显然这个原码表示十进制的-1 ,7-8=-1成立!

    关于byte整型的取值范围为(-128 ~ 127) 是为啥?

    我们知道byte整型使用一个字节,也就是8位(bit)来表示二进制数据,那么直观的看应该是这样:

    正数范围:   0000 0000 ~0111 1111

    负数范围:   1000 0000 ~1111 1111

    那么很显然 :

         0000 0000 表示+0 

         0111 1111  表示+127

    那么 1000 0000难道表示 -0 ,1111 1111表示-127 ??? 那我们在取值范围看到的-128是哪来的???当然不是!!

    首先我们来解释1000 0000为什么不能代表 -0, 准确的说是为什么不能有 -0的存在!

    1000 0000不能表示 -0 的原因

    在数学中我们知道0既不是正数也不是负数,但是在计算机中由于二进制数据的高位不是0就是1 ,也就是说不是正数就是负数,因此二进制只能把0归为正数或负数,而将0表示为0000 0000 是非常自然的!所以说规定0在二进制中其实是一个正数,也就是+0!那么当然就不允许有-0这种形式的出现了,计算机不可能将一个数据以两种形式存放,否则会导致混乱,那么为了让1000 0000 不被闲置,我们自然地想让它表示其余某一个数!那么表示什么数呢?这里我们先放一放

    1111 1111不能表示-127的原因

    这其实是初学者极其容易犯的毛病,之前讲过,对于计算机来说,并不存在原码和反码,计算机存储的二进制数据都是以补码的形式存放的,因此对于1111 1111这个二进制数据来说,如果我们要得到它的十进制数据是需要求其原码的,显然1111 1111的原码是-1才对!也就是说对于计算机来说1111 1111代表的就是-1。因此我们也可以容易的得到1000 0001表示的才是-127。其实更广义的说,不只是1000 0000 ,只要是所有多字节二进制数中,最高位为1 其余位都为0的二进制数据都使用人为表示的1个数,这个数在十进制中就是-2^n (n表示除符号位以外的其余位位数)

     例如2个字节的二进制数据1000 0000 0000 0000 表示-2^15=-32768 ;注意 如1000 0000 0000其实是0000 1000 0000 0000,所以它不是以为的-2^11,而是2^11

    综上所述

    0000 0000 ~0111 1111 表示  +0 ~ +127

    1111 1111 ~1000 0001 表示   -1 ~  -127

    咦,我们好像漏了 1000 0000 这个二进制了,哈哈,到现在为止一切都解决了,其实我们人为规定 1000 0000表示十进制中的-128!当然我们不可能说通过 1000 0000这种二进制求其原码得到某一个数,因为非高位全是0,无法再借位减1了!

    其实这种规定是很自然的,1000 0000 -0000 0001=0111 1111,而0111 1111 这个补码表示的是+127,我们可以将 1000 0000这个二进制作为正数和负数之间的一个分水岭(尽管1000 0000本身代表负数),1000 0000再进位就会进入负数范围,若借位就会进入正数范围,就好似1000 0000(-128)将 1000 0001(-127) ~0111 1111(+127)首尾连接了起来形成了一个闭环!!!

    讲到这里 所有的疑问就解决了,感谢你的观看!

    更多相关内容
  • 原码反码和补码PPT学习教案.pptx
  • 负数的原码反码和补码

    万次阅读 2015-09-29 15:50:18
    负数的原码最高位为1,与真值之间换算方便,但对于做减法的操作却很无力,于是引进了反码和补码;负数的反码为它的正数按位取反,也就是说把符号位数值位都取反,比如4的反码为00000100B,则-4的反码为11111011B...

              As we all know,正数的三码都一样,注意一下最高位为符号位即可;

             负数的原码最高位为1,与真值之间换算方便,但对于做减法的操作却很无力,于是引进了反码和补码;负数的反码为它的正数按位取反,也就是说把符号位和数值位都取反,比如4的反码为00000100B,则-4的反码为11111011B,可以看出,8位的二进制数可以表示的反码范围为-127~+127,即10000000B~01111111B;

             补码一直都是这一块的难点,经常出一些很边缘的数值来麻痹我们,按照教科书的常规解法为负数的补码最高位为1,其数值部分由它的反码加1形成,如-127的原码为11111111B,则反码为10000000B,所以对一个负数的反码求真值时,符号位不动,7个数值位取反即可;

             -127的补码为其反码+1,即10000001B,如果按照常规算法,10000000B和00000000B都表示0(分别为-0和+0),在实际运算时这二者是相等的,秉承不冗余的唯一原则,规定10000000B不再表示-0,而是-128,注意这里是说的补码,即-128的补码为10000000B,我们可以将补码连同符号位看作一个数,只是用最高位加以区别。如-128的最高位为1,表示其为负数,2^7=128,所以它的值为-128,再如-4的补码为11111100B,就相当于-128+(64+32+16+8+4);

              当一个数要减去另一个数时,只要加上其反码就可以了,这对于加减运算极其方便,比如7-19,就相当于7+(-19)的补码,即00000111B+11101101B,结果为F4H,这时为补码,转换为原码为-12,结果正确;负数的原码和补码之间的转换如果按照他们三者之间的关系来做的话相当麻烦,很容易出错,这里就有一个好方法,对于原码,从低位到高位遇到第一个‘1’之前保留原数值(包括这个‘1’),之后除符号位外全部取反,这样便得到了该数的补码,反之亦可,大家可以试一下。

    ——————————————————   分割线   —————————————————————

    2019.10.14更新

    最近几篇手绘知识点--指针系列文章阅读量差异较大,比如第二篇耗费大量精力最终木有过百,心凉啊。。。

    刚创建了一个公众号,一开始的文章是和csdn博客同步的,后续会着重来做这一块,比如发布第一手信息,抽个奖啥的,希望各位小伙伴支持一下,加个关注,如果能帮忙宣传一下就更完美了,爱你们,还是那句话,让我们一起努力,共同进步~

    公众号为“非著名IT表演艺术家”,比较中二的名字,就是灵光一闪,然后这个名字就冒出来了……

    大家也可以扫码关注,拜托了:

    展开全文
  • 什么是原码反码和补码

    千次阅读 2022-07-26 14:43:28
    补码很好的解决了反码负数不能跨零计算的弊端,并且补码还可以记录一个特殊的值-128,这个数据在1个字节下是没有原码和反码学习了原码反码和补码的知识之后,我们就可以了解到,Java当中所有的基本数据类型。...

    什么是原码、反码和补码

    1、机器数

    前言

    一个数在计算机中的表示形式是二进制的话,这个数其实就叫机器数。

    机器数

    机器数通常是带有符号的(指有正数和负数之分),计算机用最高位存放符号,这个 bit 一般叫做符号位。 正数的符号位为 0, 负数的符号位为 1。比如,十进制中的数 +7 ,计算机字长为8位,转换成二进制就是 0 0 0 0 0 1 1 1一个 byte 有 8bit,有效的取值范围是 -128 ~ +127)。

    如果是 -7 ,就是 1 0 0 0 0 1 1 1 。一个存储的二进制码分原码、反码、补码,下面我们就来介绍一下什么是原码、反码、补码

    Notes

    计算机底层使用二进制形式的补码来计算和存储数据

    2、原码

    定义

    十进制数据的二进制表现形式就是原码,原码最左边的一个数字就是符号位,0为正,1为负。

    例如:56 -> 0 0 1 1 1 0 0 0

    左边第一位为符号位,其他位为数据位。

    一个byte有8bit,最大值是 0 1 1 1 1 1 1 1 (+127),最小值是 1 1 1 1 1 1 1 1 (-127)

    在计算机中之所以使用二进制来表示原码是因为逻辑简单,对于电路来说只有开或者关两种状态,用二进制是在方便不过的了。如果使用的进制是十进制、八进制或者十六进制的话,电路没有办法表示那么多的状态

    • 正数计算

    使用原码对正数进行计算不会有任何问题的

    例如:5 + 2

    0 0 0 0 0 1 0 1
    +       0 0 1 0
    0 0 0 0 0 1 1 1
    

    把这个结果转成十进制刚好就等于7,完全正确无误

    • 负数计算

    但是如果是负数的话,那计算的结果就会大相径庭了

    我们拿 -56 这个数字来举例,它的原码是 1 0 1 1 1 0 0 0 ,减一之后,就会变成 1 0 1 1 0 1 1 1 ,这个数转成十进制就是-55。计算前是-56,减一之后正确的结果应该是-57(1 0 1 1 1 0 0 1)才对,居然还越减越大了

     1 0 1 1 1 0 0 0
    -              1
     1 0 1 1 0 1 1 1
    

    原码计算负数

    为了解决原码不能用于计算负数的这种问题,这时候,反码它出现了,作为负数的“计算的救星”。

    计算规则是正数的反码不变和原码一致,负数的反码会在原码的基础上,高位的符号位不变,其他位取反( 1 变成 0 , 0 变为 1 )。

    3、反码

    定义

    正数的反码是其本身(等于原码),负数的反码是符号位保持不变,其余位取反。 反码的存在是为了正确计算负数,因为原码不能用于计算负数

    十进制数字原码反码
    +00000 00000000 0000
    -01000 00001111 1111
    -11000 00011111 1110
    -21000 00101111 1101
    -31000 00111111 1100
    -41000 01001111 1011
    -51000 01011111 1010
    -61000 01101111 1001
    -71000 01111111 1000
    • 负数计算

    这时候,我们再来使用反码计算一下 -56 - 1 的结果

    -56 的原码是 1 0 1 1 1 0 0 0 ,如果转成反码(符号位不变,其他位取反),

    那么它的反码就是 1 1 0 0 0 1 1 1

     1 1 0 0 0 1 1 1
     -             1
     1 1 0 0 0 1 1 0
    

    反码计算负数

    -56 -1 = -57,-57的原码是 1 0 1 1 1 0 0 1,转成反码刚好是 1 1 0 0 0 1 1 0,刚好等于刚才我们算出的值

    • 跨零计算

    不过反码也有它的“软肋”,如果是负数跨零进行计算的话,计算得出的结果不对

    我们拿-3 + 5来举例

    -3 的原码是 1 0 0 0 0 0 1 1,转成反码的话就是 1 1 1 1 1 1 0 0

    1 1 1 1 1 1 0 0
    +       0 1 0 1  
    0 0 0 0 0 0 0 1 
    

    反码计算跨零

    把计算结果转成十进制就是126,这结果显然不对。那么我们该怎么计算呢,这时候补码就出现了,作为反码的补充编码

    4、补码

    定义

    正数的补码是其本身,负数的补码等于其反码+1。因为反码不能解决负数跨零(类似于-6 + 7)的问题,所以补码出现了。

    十进制数字原码反码补码
    +00000 00000000 00000000 0000
    -01000 00001111 11110000 0000
    -11000 00011111 11101111 1111
    -21000 00101111 11011111 1110
    -31000 00111111 11001111 1101
    -41000 01001111 10111111 1100
    -51000 01011111 10101111 1011
    -61000 01101111 10011000 0010
    -71000 01111111 10001111 1001
    -1271111 11111000 00001000 0001
    -1281000 0000
    • 跨零计算

    这时候,我们再来使用反码计算一下-3 + 5的结果

    -3 的原码是 1 0 0 0 0 0 1 1,转成反码的话就是 1 1 1 1 1 1 0 0,再转成补码就是 1 1 1 1 1 1 0 1

    1 1 1 1 1 1 0 1
    +       0 1 0 1  
    0 0 0 0 0 0 1 0
    

    把这个数转成十进制刚好等于2,结果正确

    5、总结

    在计算机当中都是使用补码来进行计算和存储的。补码很好的解决了反码负数不能跨零计算的弊端,并且补码还可以记录一个特殊的值-128,这个数据在1个字节下是没有原码和反码

    学习了原码、反码和补码的知识之后,我们就可以了解到,Java当中所有的基本数据类型。比如整数类型的数据类型,存储的数都是同样的,区别是在于什么地方,假设存储的值都是10

    基本数据类型字节数内存中实际存储的值
    byte1010000 1010
    short1020000 0000 0000 1010
    int1040000 0000 0000 0000 0000 0000 0000 1010
    long1080000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1010

    从上表中我们可以得出一个结论,为了凑齐字节数,所占的字节越大,则前面补的零越多。

    类型转换原理

    • 隐式类型转换
    public class Test {
    	public static void main(String[] args) {
        	// 小的数据类型往大的数据类型进行转换底层就是通过左补零完成的
            byte a = 10; // 0000 1010
            int b = a;	 // 0000 0000 0000 0000 0000 0000 0000 1010
            System.out.println(b);
        }
    }
    
    • 强制类型转换
    public class Test {
    	public static void main(String[] args) {
        	int a = 300;	   		// 0000 0000 0000 0000 0000 0001 0010 1100
            byte b = (byte) a; 		// 0010 1100
            System.out.println(b);	// 打印出44
            /*
            	int a = 200;	  		// 0000 0000 0000 0000 0000 0000 1100 1000
            	byte b = (byte)a; 		// 1100 1000
            	System.out.println(b);	// 打印出-56
            */
        }
    }
    

    补码的运算也适用于逻辑运算符

    运算符含义运算规则
    &逻辑与0为false,1为true,当都为1时才为true
    |逻辑或0为false,1为true,当有至少一个为1时为true,如果都没有则为false
    <<左移向左移动,低位补零
    >>右移向右移动,高位补零,符号位按照原来数字的符号位不变
    >>>无符号右移向右移动,高位补零
    展开全文
  • 一、机器数真值 1. 机器数 一个数在计算机中的二进制表示,叫做这个数的机器数。在计算机中最高位为符号位。0代表正数,1代表负数。 +1 机器数(8位):0000 0001 -1 机器数(8位):1000 0001 补充 计算机存储...

    一、机器数和真值

    1. 机器数
    一个数在计算机中的二进制表示,叫做这个数的机器数。在计算机中最高位为符号位。0代表正数,1代表负数

    +1 机器数(8位):0000 0001
    -1 机器数(8位):1000 0001
    

    补充
    计算机存储最小单位,位(bit)
    1位=1bit
    1Byte = 8bit
    换算公式如下:
    在这里插入图片描述
    2. 真值

    顾名思义就是数据的真正的值。
    1000 0001 的真值是-1
    0000 0001 的真值是+1
    一个字节代表的真值范围是 [-128,127] 计算机用码表示,请看下文,知道来历。

    二、原码、反码、补码的基础概念和计算方法

    1. 原码
    原码=符号位+真值得绝对值。

    +1的原码 = 0 000 0001
    -1的原码 = 1 000 0001

    则一个字节表示的机器数范围是 [11111111,01111111]
    真值范围是[-127,127]
    

    2. 反码
    正数的反码不变,负数的反码是符号位不变其余的取反。

    +1的反码 = 0000 0001/原码 = 0000 0001/反码
    -1的反码 = 1000 0001/原码 = 1111 1110/反码

      如果用反码来表示负数的值,人脑是无法直观的看出他的真值。
    

    3. 补码
    正数的补码不变,负数的补码符号位不变,其余各位取反后再加1
    也就是 负数补码 = 负数反码 +1

    +1的补码 = 0000 0001/原码 = 0000 0001/反码 = 0000 0001/补码
    -1的补码 = 1000 0001/原码 = 1111 1110/反码 = 1111 1111/补码

    	对于负数的补码,人脑也是无法直接读取的。
    

    三、为何要使用原码、反码、和补码

    因为减去一个正数就是加上一个负数,所以计算机可以设计成只有加法.
    补码

    展开全文
  • 零的原码反码和补码

    万次阅读 2018-08-13 09:27:37
    +0 -0 原码:00000000 100000000 反码:00000000 111111111 补码:00000000 000000000
  • 文章目录3.1.原码3.2.反码3.2.1.概述3.2.2.反码的计算3.2.2.1.如:计算2的反码的过程3.2.2.2.如:计算-2的反码的过程3.2.3.反码深入解析3.2.3.1....正数补码的结算:正数的补码与其二进制原码一致3.3.
  • 原码反码补码

    万次阅读 多人点赞 2022-04-20 21:03:55
    原码反码补码的概念 原码反码补码 0的问题 原码反码补码 表示范围 二进制转十进制
  • 原码补码反码之间的关系计算
  • 原码反码和补码

    2022-03-15 13:55:34
    1.原码 就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。 2.反码 正数的反码与其原码相同. ... 已知某数X的原码为0B10110100,试求X的补码和反码。 已知补...
  • 原文作者:smile4lee ... 这是从原文中截取的一段,对小错误进行了一些改动,更加深入的分析,请参考作者的原文。...在开始深入学习前, 我的学习建议是先”死记硬背”上面的原码, 反码和补码的表示方式以及计算方法. ...
  • 二进制原码反码补码

    千次阅读 2021-11-30 08:25:50
    文章目录1、有符号数无符号数2、二进制的原码、反码、补码原码反码补码小结举个栗子:3、思考:java中为什么byte的取值范围是-128~1274、Java中的<< >> >>> 1、有符号数无符号数 其实...
  • 原码反码补码、移码的作用? ... 为了便于运算,带符号位的机器数可采用原码反码和补码等不同的编码方法,机器数的这些编码方法称为码制。  原码反码补码、移码如何表示?  举例:[+4
  • 数在计算机中是以二进制形式表示的。...例如0000001 就是+11000001 就是-1正数的反码和补码都是和原码相同。负数的反码是将其原码除符号位之外的各位求反[-3]反=[10000011]反=11111100负数的补码是将...
  • 原码反码补码的互换
  • 由于计算机的二进制原理,计算机只能识别0、1组合成的二进制数字,不管给计算机...所以这些二进制之间的运算也要通过一系列的规则与表达方式进行,这些运算表达方式包括原码反码和补码,本博客按照逻辑顺序进行论述。
  • 你知道为什么计算机的设计者要提出原码反码和补码,直接把十进制转化成二进制数使用不行吗?
  • 原码反码补码间关系

    2021-05-22 18:33:47
    反码:正数的反码就是其原码;负数的反码是将原码中,除符号位以外,每一位取反。 如单字节的5的反码为:0000 0101;-5的反码为1111 1010。补码:正数的补码就是其原码;负数的反码+1就是补码。 如单字节的5的补码...
  • 二进制的原码反码补码

    千次阅读 2022-07-26 09:34:03
    二进制的原码反码补码
  • 原码反码补码的概念,以及原码反码的表示形式

    千次阅读 多人点赞 2022-03-17 23:24:40
    本文主要讲解计算机的原码, 反码补码.的概念,以及原码反码的表示形式,以及原码反码补码之前如何相互转换,还有计算机中数字是怎么样存储的。
  • 原码反码补码 详解!

    千次阅读 2021-03-25 23:56:00
    本篇文章讲解了计算机的原码反码和补码,并且进行了深入探求了为何要使用反码和补码,以及更进一步的论证了为何可以用反码补码 一. 机器数机器数的真值 在学习原码反码和补码之前, 需要先了解机器数...
  • 原码反码补码及小数的存储

    千次阅读 2022-04-24 19:52:35
    原、反、补码以及小数的存储
  • 原码反码补码傻傻分不清?计算机最底层存储为什么要用补码?补码怎么来的?补码怎么算的?为什么八位二进制能表示-128-127?总结了一些知识,希望能对你有所帮助
  • 负数的补码原码的符号位不变,其余位按位取反,并在末尾加1(即在反码的基础上加1)。 n位数的数值范围: 原码 反码 补码 例如8位2进制数...
  • 原码, 反码, 补码 计算原理详解

    千次阅读 多人点赞 2019-04-28 21:27:41
    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家...
  • 数值有正负之分,计算机就用一个数的最高位存放符号(0为正,1为负).这就是机器数的原码了.因为在两个整数的加法运算中是没有问题的,于是就发现问题... 负数的补码就是对反码加一,而正数不变,正数的原码反码补码是一样的.
  • 正数的原码反码补码都是其本身,你可认为正数原码就是反码或者补码。负数的补码符号位不变,其余按位取反。补码等于反码加1,原码符号位不变其余按位取反后加1为反码。 二、原码、反码、补码的计算 1.原码 原码就是...
  • 原码反码补码PPT学习教案.pptx

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 35,975
精华内容 14,390
关键字:

原码、反码和补码