补码

负数为什么要用补码来表示?

穿精又带淫゛_ 提交于 2019-12-06 19:12:26
上篇文章讲了“负数在计算机中是怎么存储的”。看完之后,应该对原码,反码,补码有了基本的了解了。 今天,我们深入探讨一下,为什么计算机中要用补码来表示负数? 首先,我们应该清楚,原码是方便给人看的。看到一个数的原码,我们就能根据符号位和后边的二进制位,计算出这个数的实际值。为了简单起见,我以一个字节8位来举例,如 // 1 的原码 ,最高位0代表正数 0000 0001 // -1 的原码, 最高位1代表负数 1000 0001 可以看到,1和 -1 的原码只有符号位不同。然后,思考一个问题,1 - 1 = ? 是的,我们可以直接通过减法去计算,得出1-1=0 。但是,做减法运算时,可能会遇到不够减而需要借位的情况,这显然是比较麻烦的。我们换一种思路。 1-1 在数学中等同于 1+(-1)。这样,把减法转换为加法就简单的多了,只需要考虑进位就可以了。(其实,计算机中只有加法器,没有减法器,因此减法是通过加法器来计算的。) 于是,我们看下,把1和-1的原码相加等于多少(需要让符号位也参与运算) 0000 0001 + 1000 0001 1000 0010 结果是 -2 ,这显然不符合我们的预期。 为了解决原码减法的问题,于是,出现了反码。使用反码,再来计算一下。 // 1的反码,同原码 0000 0001 // -1的反码,符号位不变,其他取反 1111 1110 相加之后,得

负数在计算机中是怎么存储

别说谁变了你拦得住时间么 提交于 2019-12-06 15:09:32
今天,发生一件非常有趣的事情。 公司同事问了我一个问题:为什么 2.0 - 1.1 = 0.89999999 呢?不应该是 0.9吗? 原来是,他问了周围一圈的同事,都给他的是同一个回答,说这是精度问题。他百思不得其解,怎么就会产生精度问题呢。再问,就没人知道原因了。 然后,我就看到了他抱着一本厚厚的书在看。拿过来一看,是一本Java书,厚厚的六百多页,这还仅是第一卷。哟呵,这是准备大干一场啊。 看在他这么努力学习的份上,还有他那对知识极度渴望的眼神。我决定,把我毕生所学传授与他。 于是,就给他详细讲解了,计算机中是怎么存储一个数的,十进制是怎么在转二进制的过程中丢失精度的,以及浮点数是怎么遵循IEEE 754 规范的,在浮点数进行加减运算的过程中会经历对阶、移位运算等过程,以及在此过程中是怎么丢失精度的。(这些问题在之前的文章中都有解答,参看“为什么0.1+0.2=0.30000000000000004”) 然后,成功的把他彻底搞懵逼了。怎么这么难啊。 原来,他的计算机基础比我还匮乏,不知道什么是位运算,不知道什么是原码、反码和补码。 本着我的热心肠,我就给他普及了一下这些知识 ---- 负数的补码形式和位移运算。 我们知道,一个数分为有符号和无符号。对于,有符号的数来说,最高位代表符号位,即最高位1代表负数,0代表正数。 在计算机中,存储一个数的时候,都是以补码的形式存储的

计算机的各种码

泄露秘密 提交于 2019-12-06 10:06:54
在计算机中,数据一律是用二进制补码来存储。 符号位:二进制左边第1位,1表示负,0表示正 有3种码,原码、反码和补码。 正数:原码=反码=补码 负数:反码=原码除符号位其他全部取反,补码=反码+1 正数就不举例了,举例负数-1 原码:1000 0001 反码:1111 1110,除符号位外其他取反 补码:1111 1111,反码+1。 二进制补码转为十进制,我的计算方法是:-2 8 +2 7 +2 6 +2 5 +2 4 +2 3 +2 2 +2 1 +2 0 =-128+64+32+16+8+4+2+1=-1 暂且认为以上是对的,但是对于转型就有些争议了。 看到很多博客对转型说法各不相同,虽然字节少的转为字节多的高位补0没有异议,但是是强转为字节少的,损失精度,截取 原数的原码(还是补码) 的低位部分 是作为 新数的原码(还是补码) 各有说法。通过4个例子验证一下。验证结果是:将原数的补码 的低位部分 作为 新数的补码。 int x=3; byte a=(byte)x; System.out.println(a);//3 3的二进制各种码都一样,为00000000 00000000 00000000 00000101;截取低位8位,00000101,无论怎么表示都是正数,说法x的原码截取后8位给a当原码,或者x的补码截取后8位给a当补码都说得通

原码、反码和补码

我的未来我决定 提交于 2019-12-06 09:51:11
先看一下常见资料给出的定义:(8位整型) 原码 :-127~127 一个二进制数左边加上符号位后所得的码。最高位为符号位,"0"表示正,"1"表示负。 反码 :-127~127 正数的反码——与原码相同。 负数的反码——符号位为“1”,数值部分按位取反。 补码 :-128~127 正数的补码——与原码相同。 负数的补码——将其原码除符号位之外的所有位取反后加1。即“ 反码+1 ”。 原码:用于计算机处理数据、并区分正负数。 补码:用于计算机运算减法。(减一个数,变成加这个负数的补码, 如:10-2 变成 10 + (-2的补码) 转自:https://zhuanlan.zhihu.com/p/80618244 由补码,求原码: 正数:补码和原码相同; 负数:补码先减一,得到反码,反码除符号位外,取反,再得到原码。和原码求补码的过程正好反过来; 或者,求负数补码,直接用“左右找1, 1不变,中间取反求得”就是找到该补码的左边和右边的第一个1,然后左边和右边的第一个1都不变,再把这两个1中间的数都取反,就得到其原码了; 来源: https://www.cnblogs.com/Allen-rg/p/11975118.html

关于二进制

情到浓时终转凉″ 提交于 2019-12-06 08:25:24
一、二进制的原码、反码、补码1、注:正数反码和补码=原码;负数反码->符号位不变,其它位取反;负数补码->取反码+1。数字:28  8位原码:00011100  8位反码:00011100  8位补码:00011100数字:-28  8位原码:10011100  8位反码:11100011  8位补码:111000111 来源: https://www.cnblogs.com/qinggg/p/11972087.html

源码,反码,补码

瘦欲@ 提交于 2019-12-06 07:13:46
原文地址: https://www.imooc.com/article/16813?block_id=tuijian_wz 我的总结:太多地方说负数的补码=反码+1,理解了这篇文章之后,发现,这仅仅是个巧合,补码和反码有关系,但是没有直接关系。 本文从原码讲起。通过简述原码,反码和补码存在的作用,加深对补码的认识。力争让你对补码的概念不再局限于: 负数的补码等于反码加一 。 接触过计算机或电子信息相关课程的同学,应该都或多或少看过补码这哥仨。每次都是在课本的最前几页,来上这么一段: 什么反码是原码除符号位,按位取反。补码等于反码加一。 然后给整得莫名其妙,稀里糊涂地,接着就是翻页,反正后面的内容也跟三码没多大关系。 我原来也是看了好几遍都没看懂。古人云:事不过三。学C语言的时候,看过一次。不懂?看《计算机基本组成原理》的时候看过,还是不懂!到了大三,上《单片微机原理与接口技术》的时候仍旧是不懂。到了期末,复习的时候,和宿舍的人瞎聊。说讲讲这些码呀,我说我也不是很清楚呀。然后就一边说怎么求码,一边算。玩着玩着,突然就明白了。我说好,打住。不说了,放假我在好好整理下思路,于是就有了这篇额。。算讨论帖吧。 好了,废话不多说。开始我们的原码,反码,补码之旅。 (一)预备知识 认识二进制,十六进制。会二进制与十进制的相互转化运算 由计算机的硬件决定,任何存储于计算机中的数据,其

原码、反码、补码之间的快速转换和简单运算

冷暖自知 提交于 2019-12-06 06:55:36
现在很多人都在学习计算机语言,那么原码、反码、补码之间的快速转换和简单运算是怎么样的呢?今天小编为大家讲讲具体的方法,希望能够对大家有所帮助。 正数部分: 正整数的原码、反码和补码是一样的,即看到符号位(第一位)是0,就可以照着写出其他两种码。 负数部分转换: 原码和反码的相互转换:符号位不变,数值位按位取反 原码和补码的相互转换:符号位不变,数值位按位取反,末位再加1 已知补码,求原码的负数的补码:符号位和数值位都取反,末位再加1 负数部分具体情况: 1) 原码转换为反码:符号位不变,数值位分别“按位取反” 2) 反码转换为原码也是一样:符号位不变,数值位分别“按位取反” 3) 原码转换为补码:符号位不变,数值位按位取反,末位再加1 4) 补码转换为原码:符号位不变,数值位按位取反,末位再加1。 即补码的补码等于原码 5) 求补(变补),即已知[X]补,求[-X]补 。 符号位和数值位都取反,末位再加1 来源: https://www.cnblogs.com/niuyaomin/p/11967168.html

JavaSE基础(九)--Java二进制运算

前提是你 提交于 2019-12-06 05:44:57
Java二进制运算 Java二进制表示法 首先了解下二进制,二进制是相对十进制而言的,当然还有八进制,十六进制等等,我们常用的都是十进制,计算机用的都是二进制,而符号表示常用十六进制。 二进制就是只有0、1两个值表示的数,规则是逢二进一。数据存储在内存中都是存储的二进制,二进制又可分为原码、反码、补码。最终存储在内存中的是“补码”。 在了解原码、反码、补码之前先得了解一下机器数和真值。 机器数 一个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数是带符号的,在计算机用机器数的 最高位 存放符号,正数为0,负数为1。比如,十进制中的数 +3 , 计算机字长为8位 ,转换成二进制就是 0000 0011 。如果是 -3 ,就是 100 00011 。那么,这里的 0000 0011 和 1000 0011 就是机器数。 机器数的真值 因为第一位是符号位,所以机器数的形式值就不等于真正的数值。 例如上面的有符号数 1000 0011,其最高位1代表负,其真正数值是 -3,而不是形式值131(1000 0011转换成十进制等于131)。 所以,为区别起见, 将带符号位的机器数对应的真正数值 称为 机器数的真值 。例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1。 原码、反码

原码 补码 反码

血红的双手。 提交于 2019-12-06 05:24:55
一、原码原码表示法是机器数的一种简单的表示法。其符号位用0表示正号,用:表示负号,数值一般用二进制形式表示。求原码:X≥0,则符号位为0,其余照抄;X≤0,则符号位为1,其余照抄。【例1】X=+1001001 [X]原 = 01001001【例2】X=-1001001 [X]原 = 11001001二、反码机器数的反码可由原码得到。如果机器数是正数,则该机器数的反码与原码一样;如果机器数是负数,则该机器数的反码是对它的原码(符号位除外)各位取反而得到的。设有一数X,则X的反码表示记作〔X〕反求反码:若X≥0,符号位为0,其余照抄;若X≤0,符号位为1,其余按位取反。【例3】X=+1001001 [X]反 = 01001001【例4】X=-1001001 [X]反 = 10110110三、补码机器数的补码可由原码得到。如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在未位加1而得到的。求补码:若X≥0,符号位为0,其余照抄;若X≤0,符号位为1,其余取反后,最低位加1。【例5】X=+1001001 [X]补 = 01001001【例6】X=-1001001 [X]补 = 10110111一般计算机存储的是补码如果算原码的话就是在知道补码的符号位为1时候这时候需要将补码末尾数字

【计算机网络】-传输层-Internet传输协议-UDP

天大地大妈咪最大 提交于 2019-12-06 00:02:46
【计算机网络】-传输层-UDP 简介 Internet协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,UserDatagram Protocol) 。UDP为应用程序提供了一-种无需建立连接就可发送封装的IP数据报的方法。 UDP的头 段:UDP传输的段( segment)由8字节的头和有效载荷字段构成。 端口号:两个端口(port) 分别用来标识源机器和目标机器内部的端点。 UDP长度:(UDP Length)字段包含8字节的头和数据两部分的总长度。最小长度是8 个字节,刚好覆盖UDP头。最大长度是65515字节,恰好低于填满16比特的最大字节数,而这是由IP数据包限制的。 校验和:一个可选的校验和(UDP Checksum)字段还提供了额外的可靠性。它校验头、数据和一个概念性的IP伪头。执行校验和计算时,校验和字段先被设置为零,如果数据字段的长度是奇数则用零填充成偶字节。校验和算法很简单,先按16位字的补码相加求和,然后再取总和的补码。因此,当接收端对整个段计算校验和时,要包括UDP校验和字段,正确的结果应该为0。如果发送端没有计算校验和,则将该字段值填为0,因为补码计算结果可能碰巧真的是0,则存储为全1.然而,关闭校验和计算不是明智之举,除非数据传输的质量并不重要(例如,数字化语音)。 远程过程调用 RPC通过网络将应用程序与熟悉的过程调用抽象连接起来