补码

【转载】终于搞明白二进制中,原码、反码、补码 到底都是些什么东东?

故事扮演 提交于 2020-02-13 09:39:43
要说清这个问题,需要颠覆你对补码的理解 第一步,就像练北冥神功要先散功一样,先把你心中对原码,反码,补码的一套认识全部忘掉 | | | | | | | | | | | | | | | | | V 第二步,正式开讲 首先灌输一个新的概念叫,模 什么是“模”,想象日常使用的钟表,它可以显示0~12点的时间,假设现在是2点钟,请用手动拨动时针的方式将时间减4小时,你会怎么做? 有两种方式: 逆时针将时针拨4小时 顺时针将时针拨8(12-4)小时 这里要讲的是第二种方式,为什么顺时针拨12-4也可以达到和正常思维的第一种方式一样的位置。 12就是模。 同样的,如果是十进制的两位数,80-10 和 80+90在不考虑百位数的基础上都是70。这里的90就是100-10得来的,这种情况下100就是模 模就好比是一个极限,在它的范围内,两个相加等于模的数互为补数,还是举100的例子 90和10, 55和45,68和32,互为补数 在模的范围内做减法,可以将“ X-Y ”的减法变更为“ X+Y的补数 “的加法,当然前提是不考虑百位数 思考题, 上面举的例子是大数减小数,那么如果是小数减大数会怎么样呢? 如果是10-80,结果应该是-70,但如果按照10+(100-80),结果是30。 而很明显-70和30不是一回事,这里也没有百位数的问题,这种情况应该怎么破? 当初的那些先贤们想出来的办法很简单

原码,补码和反码

馋奶兔 提交于 2020-02-13 09:39:29
一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1、机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。 那么,这里的 00000011 和 10000011 就是机器数。 2、真值 因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。 所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1 二. 原码, 反码, 补码的基础概念和计算方法. 在探求为何机器要使用补码之前, 让我们先了解原码, 反码和补码的概念.对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式. 1. 原码 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制: [+1]原 = 0000 0001 [-1

关于原码、反码和补码的介绍及转化关系

一笑奈何 提交于 2020-02-13 09:39:13
计算机中的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,是计算机中对数字的二进制定点表示方法。符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。下面依次介绍并给出相互的转换关系: 原码: 简单直观;例如,我们用8位二进制表示一个数,+11的原码为00001011,-11的原码就是10001011。但参加运算可能出错。例如数学上,1+(-1)=0,而在二进制中,00000001+10000001=10000010,换算成十进制为-2,显然出错了。 反码: 反码通常是用来由原码求补码或者由补码求原码的过渡码。反码跟原码是正数时,一样;负数时,反码就是原码符号位除外,其他位按位取反。 补码: 在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。 1、一个负整数(或原码)与其补数(或补码)相加,和为模。 2、对一个整数的补码再求补码,等于该整数自身。 3、补码的正零与负零表示方法相同。 总之,正整数的补码是其二进制表示,与原码相同。求负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1。 即正整数的原码反码补码一样;负整数的反码是除了原码符号位其他位全部取反

剑指offer:11.二进制中1的个数

馋奶兔 提交于 2020-02-12 19:44:59
https://github.com/PhillipHuang2017/SwordOffer 11.二进制中1的个数 题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 解题思路 负数用补码表示,所以运算方法和正数一样,无需做特殊考虑。 这里用到了一个很巧妙的运算方式,即 n & (n - 1) ,这个运算表示将最右边的1变成0,解释见下面 因为 n-1 表示将 n 最右边的1变成0,然后把那一位后面的0全都变成1,前面不变,因此如果用 n 和 n-1 做与运算的话, n 原本最右边的1就变成了0 ,一直重复上面的过程直到 n 变为全0 。 如果用Python的话,由于python的数据是动态的,可以认为是无限长的,存储的形式又是补码,因此负数就会有非常多的1,会导致无限循环,因此需要先用 n = n & 0xffffffff 代码把数据截取为32位,再进行操作。 代码 C++ class Solution { public : int NumberOf1 ( int n ) { int count = 0 ; while ( n ) { count ++ ; n = n & ( n - 1 ) ; } return count ; } } ; Python方法1 class Solution : def NumberOf1 ( self , n ) : #

计算机组成原理学习(二)原码,反码,补码

烈酒焚心 提交于 2020-02-12 17:35:44
数据在计算机中以二进制串存储,这种01序列叫“ 机器数 ”。 每个机器数都有对应的值,比如0001换算就是现实里十进制的1,这个值叫它的“ 真值 ”。 1.原码 为了表示负数的前面的符号,一种办法是采用“ 最高一位表示符号而非数值 ”的编码方式——原码。 如八位的运算器,机器数0000 0001的真值为1,1000 0001的真值为-1。第一位为符号位,剩下的位表示真值。 解决了符号表示问题,但是引出了新的问题,那就是1000 0001不能按照常识意义上来换算了,按正常二进制转十进制的换算,1000 0001实际上代表129。 这样在硬件电路设计时会带来麻烦,要让机器能够先辨识符号位,再进行真值的计算。 2.反码 任何减法都可以转化为加上一个负数,如 1+1 = 1+(-1)。做加法比减法简单,要是能用一种新的编码方法把-1表示出来,然后和+1做加法,最后结果按照这种编码方式还是正确的,那就太好了。于是 为了让符号位也能参与计算 ,反码诞生了。 反码的表示方法基于原码,最高位仍然是符号位。正数的反码是其本身,负数的反码 符号位不变,剩下的位全部取反 。 +1 原码0000 0001,反码 0000 0001 -1 原码1000 0001,反码1111 1110 人们发现,采用这种编码方式,算出来的值是正确的。 用反码计算: 1-1 = 1+(-1) = 0000 0001 +

多么痛的领悟——计算机组成原理第一讲

十年热恋 提交于 2020-02-07 11:01:53
多么痛的领悟——计算机组成原理第一讲 前言 大家好,我是 泰斗贤若如 ,我又开始更新文章了,本次更新的内容是 计算机组成原理 ,是大学计算机相关专业必须学的,我是大三上学期学的,刚开始学的时候感觉很难,get不到重点,直到学了一遍,被期末考试逼了一遍,我才有所领悟,多么痛的领悟啊。我打算自己把整本书中的重点总结一遍,第一是自己过一遍,第二是给新手赠予玫瑰,希望你们学的时候花最少的时间学更多的知识,别再在考试前病急乱投医了(偷笑表情) 一、计算机系统 1、计算机的硬件 计算机系统由“ 硬件 ”和“ 软件 ”两大部分组成。 所谓“ 硬件 ”,是指组成计算机的各种物理装置,我们平时说的“买一台计算机”,购买的其实就是硬件,最主要的硬件有:主板、中央处理器、硬盘、内存等。 主板 是整个计算机的“ 交通枢纽 ”,各种器件都要连接到主板上,才能正常工作。 中央处理器 是计算机的“ 大脑 ”,它是计算机的 运算核心 和 控制核心 。 硬盘 是计算机的“ 笔记本 ”,上面记录了各种数据,需要的时候,就会从这里读取或往这里写入。 内存 是计算机的“ 稿纸 ”,一般来说,同一个处理器能利用的内存越大,运算速度也就越快。 有趣的是, 显示器 虽然是人们关注最多的设备,但它其实并非是一个必须的硬件,对于个人计算机来说,即使没有显示器也可以正常运行,但只要少了上面所说硬件中的任何一个,计算机就不能正常运行了

原码、反码、补码超级无敌清楚的讲解

ぐ巨炮叔叔 提交于 2020-02-07 02:46:22
计算机中的数据可以分为:数值数据、非数值数据; 数值数据可以分为:有符号数据、无符号数据; 非数值数据包含:文字、视频、图像… 以8位(一个字节)的数据为例: 有符号数据的表示范围为:-(2的n-1次方)-1到2的n-1次方; 无符号数据的表示范围为0到2的n-1次方 无符号数据与原码、反码、补码的关系: 无符号数全是正数,原码就是该正整数的二进制表示方法; 无符号整数的原码=反码=补码; 有符号数与原码、反码、补码的关系 : (正整数的原码=反码=补码) 原码: 有符号数据中的正整数的原码就是该数的二进制数,如:2用八位二进制 表示为00000010 有符号数据中的负整数的原码就是正整数的原码的最高位(符号位)为1, 其他位不变,如-2的原码用八位来表示为10000010 反码: 有符号负整数的反码就是在原码的基础上,符号位(最高位)不变,保 持为1,其余位按位取反(也就是原来为1的位变成0,原来位0的位变为1), -2的反码就是11111101 补码: 有符号数的补码就是在原码的基础上,符号位不变,其余位按位取反, 最后在最低位加一,-2的补码就是11111110 为什么会有原码、反码、补码呢? 计算机中的数都是用补码的形式存储的; 也就是正数在计算机中的存储方式就是补码(正数的原码=反码=补码); 负数在计算机中的存储方式也是补码(负数的原码、反码、补码规则在上面);

记一次原码补码

好久不见. 提交于 2020-02-06 08:13:11
1. 求12的负数: 12, 0000 1100 补码 1111 0100 -13补码转成原码:0000 1011 12的原码:1000 1100 原码:原数据上的符号位加一变成负数如0000 1100,原码为1000 1100 补码:原码转成补码,符号位不变,其它取反,然后再加一。如原码1000 1100,补码1111 0011 补码转换成原码:补码取反。补码1111 0011,原码1000 1101 2. 求6-1 6 ,0000 0110 1 ,0000 0001 6的原码:1000 0001 1的补码-1:1111 1111 0000 0110与1111 1111相加 0000 0101 5 来源: CSDN 作者: 从小白到被迫变成大白 链接: https://blog.csdn.net/qq_44902875/article/details/104039605

进制的基础

送分小仙女□ 提交于 2020-02-06 02:43:28
二进制的第一位为符号位,其他位为数据位 二进制数= 符号位+数据位 0表示正数 1表示负数 原码表示法: 0表示正数,1表示负数。 补码表示法: 正数的原码与补码相同,二负数的补码为数字位取反再加一 二进制的反码表示法: 正数的原码与反码与补码是一样的,负数的原码只是符号位上的差异,补码是原码数据位取反再加一,反码是原码的数据位取反 定点数与浮点数 定点数的表示方法 分为纯正数,存小数,和存120.12这样的数,是需要乘以一个比例因子的变成12012或者0.12012这样的数去存储 浮点数的表示方法 浮点数终是表示成为是个科学技术法,计算机存储它的尾数,和阶数,包括阶数的符号位,与尾数的符号位 浮点数的表示范围 单精度浮点数,使用4个字节32位表示浮点数,双精度浮点数:使用8个字节 64位表示 浮点数的规格化 来源: CSDN 作者: Griffin blue devils 链接: https://blog.csdn.net/weixin_43824400/article/details/104188399

原码与补码的加减交替法的区别及例题分析

只愿长相守 提交于 2020-02-03 09:18:02
原码加减交替法 (1)商的符号由参与计算的两数的符号通过异或运算获得; (2)参加运算的两个数是绝对值的补码; (3)原码上商的原则:若余数为正,则商“1”;若余数为负,则商“0”; (4)原码除法的第一步做减法,即被除数减除数; 简而言之 首先,将两个数转换成二进制原码(若为十进制的话);然后求原码的绝对值的补码;接着将求得的补码进行减法操作,即加上补码的绝对值的负数;最后按着上商的原则进行计算,直至商的位数与除数或被除数的位数相同。 补码加减交替法 (1)商的符号在求值的过程中自然形成; (2)参加运算的两个数是补码; (3)补码上商的原则:若余数与除数同号,则商“1”;若余数与除数异号,则商“0”; (4)补码除法的第一步要根据被除数与除数的符号决定:若两数同号,则做减法;若两数异号,则做加法; 例题分析 用原码陈列除法器计算x÷y,x=11000,y=-11111 解:|x|补=x补=011000,y补=100001,|y|补=011111 x补 0 1 1 0 0 0 +[-|y|补] 1 0 0 0 0 1 —————————— 1 1 1 0 0 1 <0 q0=0 左移 1 1 0 0 1 0 +|y|补 0 1 1 1 1 1 —————————— 0 1 0 0 0 1 >0 q1=1 左移 1 0 0 0 1 0 +[-|y|补] 1 0 0 0 0 1 ——