补码

补码

℡╲_俬逩灬. 提交于 2019-12-04 06:51:27
补码是为了解决计算机中负数加法问题而引入的一个概念.我学习补码的时候,只记住了负数补码的求法 符号位不变,按位取反,再加一 ,至于为什么一直都不明白.所以这篇文章将尝试深入剖析这个问题 补码是一个相对的概念 设想有一个时钟,正好是3点,那么既可以是顺时针走了3格,也可以是逆时针走了9格,规定顺时针为正,那么3和-9其实在同一个地方,也就是说-9相对12的数是3.但是不一定非要相对12,相对15也可以的,-9相对15的数是6 补码的符号位变成值位 回到二进制中,在原码中,符号位表示这个数是正是负,但是一经转换成补码,符号位就变成了值位. 用5位二进制数做例子,最高位是符号位,其余四位是值位 \[ -10_{d}=11010_{b原码}=10110_{b补码} \] 将最高位看成是值位 \[ value=1\cdot 2^4+0 \cdot 2^3 +1 \cdot 2^2 + 1 \cdot 2^1 + 0 \cdot 2^0=22 \] 所以22是-10相对哪个数字的补码呢? 一眼看出是32,但是为什么是这个是数呢? 考虑求补码的过程 符号位不变,按位取反,再加一 .因为是负数,符号位为 1 ,加上了 \(2^4\) ;按位取反,本质是和1进行异或操作.到此为止求的是相对 \(11111_{b}\) 的补码,也就是相对于31的补码,最后再加上1,才是相对32的补码 补码的优势

(十二)golang--进制和位运算

﹥>﹥吖頭↗ 提交于 2019-12-04 06:29:15
1.基本进制 (1)二进制:0,1,满2进1 在golang中,不能直接使用一个二进制表示一个整数,可以用八进制、十进制和十六进制表示 (2)十进制:0-9,满10进1 (3)八进制:0-7,满8进1,以数字 0 开头 (4)十六进制:0-9及A-F,满16进1,以 0x或0X 开头,此处A-F不区分大小写,例如0x21AF+1=0x21B0 package main import "fmt" func main() { var i int = 5 fmt.Printf("%b \n", i) //这里^表示几次方 //转成十进制为:8^1+8^0=9 var j int = 011 fmt.Println("j=", j) //转成十进制:16^1+16^0=17 var k int = 0x11 fmt.Println("k=", k) } 2.进制之间的转换 (1)其它进制转十进制   次方相加   比如:二进制1011转为十进制:2^3+2^1+2^0=11      八进制23转为十进制:2*(8^1)+3*(8^0)=16+3=19 (2)十进制转其他进制   除法取余   11转二进制:11除以2,商为5,余数为1;5除以2,商为2,余数为1;2除以2,商为1,余数为0;1除以2,商为0,余数为1,;当商为零时,余数从后往前排列:1011 (3)二进制转八进制

原码、反码、补码详解

余生颓废 提交于 2019-12-04 04:52:18
一、机器数和真值   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]原 = 1000 0001      

JAVA_十进制数存储_补码

℡╲_俬逩灬. 提交于 2019-12-04 04:48:13
JAVA中十进制数是按照补码的形式存放的。正数的补码为其本身的二进制数(反码也是)。而负数的补码则是正数的补码在各位求反然后+1得到的。例如: 假如有一个int型变量var1 = 10。10的补码为:0000-0000-0000-0000-0000-0000-0000-1010。这也是var1在计算机中存储的数据。 假如另外一个int型变量var2 = -10。 那么,-10的补码为:0000-0000-0000-0000-0000-0000-0000-1100 ------> 1111-1111-1111-1111-1111-1111-1111-0101(各位取反)----> 1111-1111-1111-1111-1111-1111-1111-0110(最后一位+1)。 来源: https://www.cnblogs.com/A-PP-Z-droplet/p/11831108.html

原码反码补码

旧时模样 提交于 2019-12-04 02:27:44
1.原码 最高位为符号位;0表示正数,1表示负数。 ●可直观的反映出数据的大小。 2.反码 正数的反码与其原码相同; 负数的反码,符号位不变,其余位都取反。 ●解决了负数加法运算问题,将减法运算转化为加法运算。 3.补码 正数的补码与其原码相同; 负数的补码在其原码的末位加1。 ●解决了负数加法运算±0的问题。 来源: https://www.cnblogs.com/mznsndy/p/11828503.html

补码一位乘法(Booth算法,C语言实现)

隐身守侯 提交于 2019-12-04 01:33:00
补码一位乘法 首先了解下什么是补码?   补码概念的理解,需要先从“模”的概念开始。 我们可以把模理解为一个容器的容量。当超出这个 容量时,会自动溢出。如:我们最常见到的时钟,其容量 是 12,过了 12 点之后,就会变为 1 点, 2 点……也就是 说,超过12的部分将被丢弃。那么,在这个例子当中,时钟 的模就是12。模的概念可以帮助我们理解补码的含义。   补码的引出:假设现在时钟的时针指向 4 点的位 置,要使其指向 3 点,可以怎么操作呢?很明显,共有 2 种方法,顺时针拨 11 格(+11),或逆时针拨 1 格(-1)。 (为了区分顺时针和逆时针,我们用正数表示顺时针方 向转动的距离,负数表示逆时针方向转动的距离) 从上面的例子,不难发现,+11 和-1 实现了同样的 作用。主要原因是时钟的模是 12,顺时针旋转代表加法 运算:4+11=15,而达到模的部分会自动溢出,即 15-12= 3,即到达 3 点的位置。逆时针旋转代表减法运算:4-1= 3。在这个例子当中,+11和-1 是完全等价的。也就是说, 负数-1 可以用正数+11 代替,这样就可以把减法运算改 为加法运算。也可以说:+11 就是-1 的补码(模为 12 的 情况下)。 具体 的补码一位乘法(B ooth算法)    Booth算法简介    Booth算法也就是补码1位乘的比较法。被乘数为[X]补,乘数为

计算机的运算方法

邮差的信 提交于 2019-12-03 15:25:36
计算机的运算方法 无符号数 计算机中的数存放在寄存器中,通常将寄存器的位数称为机器字长, 大家说的无符号数其实就是不区分正负号的数,换句话说,就是没负数,全是正数,大家知道,计算机中的数是以0-1存储的, 假如我们的寄存器16位, 无符号数表示的范围就是0~65535 (2^64=65536), 有符号就是分正负数,总数65536就被分成两半,一半正数,一般负数,范围就是 -32768~32767 有符号数 有符号数,就是正负数同时存在, 人们固然能区分开整正负数,计算机怎么区分呢? 前面说了,计算机只认识01这样的数,于是人们规定 0表示正数, 1表示负数, 于是这样符号就被数字化了, 并且规定将其放在真实值前面, 于是有符号数就诞生了 如上图,按照计算机存数数据的特性将符号数字化, 数字化后的编码方式得到的结果称为 机器数 , 将带有+-符号的数字称为 真值 既然现在将有符号数数字化后,新的问题来了,当这些机器数之间需要进行运算时, 符号位怎么办? 符号位能否参加机器数之间的运算呢? 如果说,需要参加运算又需要哪些处理才能消除符号位对计算结果的影响呢? 这一连串问题就引出了符号位和数值位所构成的编码: 原码 , 补码 , 反码 , 移码 其实在学习的过程中该一直问自己,自己在干什么??? 就比如现在,我在前面大概说了说计算机是如何表示数字的,于是认识了机器码

关于补码的由来和作用

 ̄綄美尐妖づ 提交于 2019-12-03 14:49:57
最近在读《深入理解计算机系统》(CSAPP),第二章中关于补码的描述很有意思,在书中并没有详细叙述补码的由来和为什么要使用补码来表示有符号数,而不是用原码和反码。相反这本书详细的叙述了补码的数学表示,以及公式的推导!对补码的由来却一笔带过,甚至原码和反码只是简单的在后面的篮框提示中提了一下,根本没有出现在正文。 这在一定程度上造成了我的阅读困难,于是在搜索引擎的帮助下,我查了很多资料,了解到补码的更多细节,以及这个神奇的编码方式如何帮助人们设计CPU时节省大量的精力和金钱。这里我把他记录下来。 计算机中的信息都是用二进制表示的,在表示无符号数时并没有什么问题,但是在表示有符号整数时就出现了问题,如何在二进制中区分正数与负数呢? 区分正数和负数的另一个意义在于如果能够准确的表示出、负数,我们就可以化减法为加法,如5-4就可以表示为5+(-4),至于为什么那么多先辈要执着于把减法化为加法,原因很简单,对计算机的电路而言,计算加法要比计算减法方便的多。 很多人提出了有符号整数的编码方式,其中有: 原码 (Sign-Magnitude)、 反码 (ones' Complement)、 补码 (two's Complement)。 原码 原码的英文为sign-magnitude,第一个单词为符号的意思,第二个单词经过查询有“大小”的意思,大意应该为 符号-数值 的组合,在原码中

补码一位乘法

北慕城南 提交于 2019-12-03 14:41:58
C实现booth算法,定点小数补码一位乘法 #include <stdio.h> #include <string.h> #include<stdlib.h> #define N 10 char strA[N] = {1}; char strpB[N] = {0}; char strnB[N] = {0}; char strC[N] = {0}; char negate(char s){ if(s == '1') return '0'; else if(s == '0') return '1'; else return s; } void transformOne(char n[N]){ size_t len = strlen(n); char m[N] = {0}; for(int i=1;i<len-1;i++){ strpB[i] = n[i]; strnB[i] = negate(n[i]); } strpB[len-1] = strnB[len-1] = '1'; //最后一位必为1 if(n[0] == '+'){ strpB[0] = '0'; strnB[0] = '1'; } else{ strpB[0] = '1'; strnB[0] = '0'; for(int i=1;i<len;i++){ m[i] = strpB[i]; strpB[i] = strnB