-
2020-12-29 21:02:38
正数的补码 = 原码
负数的补码 = {原码符号位不变} + {数值位按位取反后+1} or
= {原码符号位不变} + {数值位从右边数第一个1及其右边的0保持不变,左边安位取反}
+97原码 = 0110_0001b +97补码 = 0110_0001b -97原码 = 1110_0001b -97补码 = 1001_1111b
更多相关内容 -
MATLAB 的二进制补码:计算十进制数的二进制补码。-matlab开发
2021-06-01 21:18:33在 MATLAB 中计算有符号整数的二进制补码。 -
二进制补码字符串:二进制定点二进制补码字符串和十进制数之间的转换。-matlab开发
2021-05-30 16:02:35这些函数像内置的 MATLAB 函数 BIN2DEC 和 DEC2BIN 一样在二进制字符串和十进制数之间进行转换,但可以容纳负整数(通过二进制补码)和分数正负数(通过二进制补码固定点和字符串中的二进制小数点)。 请注意,许多... -
关于二进制补码及补码加法的思考
2021-09-06 19:56:13笔者刚学数字电路,就在二进制补码处踩了许多坑,下面就来写一下我对二进制补码的感悟。 提示:以下是本篇文章正文内容,下面案例可供参考 一、生活中了解补码 首先展示一下求补码的公式N(补)=R^n-N 这里的N是原码...
前言
笔者刚学数字电路,就在二进制补码处踩了许多坑,下面就来写一下我对二进制补码的感悟。
提示:以下是本篇文章正文内容,下面案例可供参考
一、生活中了解补码
首先展示一下求补码的公式
N(补)=R^n-N
这里的N是原码,R是基数,n是位数,N(补)是补码
我们用时钟来举一个例子:
假如时钟要从
0点
转到3点
,我们可以怎么转?首先,有两种方法:顺时针转3个格
或者逆时针转12(基数)-3(原码)=9个格
,在这里,这个9
就是3
在时钟里的补码
。二、数字电路或系统中补码有什么作用?
补码是用来方便解决负数在数字电路或系统中的表示问题的。
三、补码,原码,反码之间的转换
1.例子
首先,当二进制数是正数时,它的补码,反码,原码相同;当二进制数是负数时,它的反码为原码的数值位取反,补码为反码+1.
我们来举一个例子看看:表格除去第一行,每一列顺次为原码,反码,补码
9 -9 01001 11001 01001 10110 01001 10111 四、补码加法运算
1.异号补码相加
我们来举一个例子:
利用二进制补码的形式计算(6-2)
列一下竖式:
因为是四位二进制加法计算,所以画圈的进位1
丢掉,结果为0100
2.同号补码相加
接下来我们看一下同号相加的例子:
利用二进制补码计算(6+2)
列一下竖式:
按照上面的舍弃进位,最后的结果为1000
是个负值
,这个怎么回事?
这就涉及到了一个名词溢出
。
怎么判断溢出
?
首先,有这样一个规律:
两个符号相反的数相加不会产生溢出,只有两个符号相同的数且进位位和符号位不同才会产生溢出
为什么两个符号相反的数相加不会产生溢出?
首先,n位二进制补码表示的数的范围是-2^(n-1)~(2^(n-1)-1)
,那么4位二进制补码表示的数的范围是-8 ~ +7
,所以,无论是-8+0
还是0+7
都不会超出范围。
怎么解决溢出?
用上面题来说,只需把4位二进制补码变成5位二进制补码就OK了
,如下:
这样结果就是01000
也就是十进制8
了。总结
以上就是我的感悟了,希望对大家有帮助。
如果对你有帮助,那就点赞支持一下吧
微信公众号:编程小随笔
欢迎关注! -
C++学习记录:将十进制数转换为二进制数(补码形式)
2021-03-03 19:26:22C++学习记录:将十进制数转换为二进制数(补码形式) 0、以下操作前提:不动符号位 基本运算: 1、正数的补码 等于 原码; 2、负数的补码 等于 原码取反,末位再加一; 推论: 3、补码的补码 等于 原码; 4、反码的...2021-3-3
C++学习记录:将十进制数转换为二进制数(补码形式)
0、以下操作前提:不动符号位
基本运算:
1、正数的补码 等于 原码;
2、负数的补码 等于 原码取反,末位再加一;
推论:
3、补码的补码 等于 原码;
4、反码的反码 等于 原码;
5、补码减一 等于 反码。
·
·//源码 #include <iostream> using namespace std; #define BIT 16 void transform(int binary[],int num)//简单将十进制转换为二进制 { for (int i = BIT - 1; i > 0; i--) { binary[i] = num % 2; num /= 2; if (num == 0) { break; } } } void logicNot(int binary[])//逻辑取反 { for (int i = BIT - 1; i > 0; i--) { if (binary[i] == 1) { binary[i] = 0; } else { binary[i] = 1; } } } void addOne(int binary[])//末位加一 { for (int i = BIT - 1; i > 0; i--) { if (binary[i] == 1) { binary[i] = 0; } else { binary[i] = 1; break; } } } int main() { int num; cin >> num; int binary[BIT] = {0}; if (num >= 0)//判断num是否为正数,如果是,则直接转换; { //否则需要进行相应操作,因为正数和负数的取余操作有点不一样。 transform(binary, num); } else { binary[0] = 1; transform(binary, -num); logicNot(binary); addOne(binary); } for (int i = 0; i < BIT; i++)//输出 { cout << binary[i]; if ((i+1) % 4 == 0) { cout << " "; } } cout << endl; }
-
二进制数的补码及运算(1)
2017-02-25 22:04:48本人研究不深,如有错误请不吝赐教!... = {原码符号位不变} + {数值位从右边数第一个1及其右边的0保持不变,左边安位取反} 以十进制整数+97和-97为例: +97原码 = 0110_0001b +97补码 = 0110_0001b -97原码 =本人研究不深,如有错误请不吝赐教!!
1.正数的补码表示
正数的补码 = 原码
负数的补码 = {原码符号位不变} + {数值位按位取反后+1} or
= {原码符号位不变} + {数值位从右边数第一个1及其右边的0保持不变,左边安位取反}
以十进制整数+97和-97为例:
+97原码 = 0110_0001b
+97补码 = 0110_0001b
-97原码 = 1110_0001b
-97补码 = 1001_1111b
2.纯小数的原码
纯小数的原码如何得到呢?方法有很多,在这里提供一种较为便于笔算的方法。
以0.64为例,通过查阅可知其原码为0.1010_0011_1101_0111b。
操作方法:
将0.64 * 2^n 得到X,其中n为预保留的小数点后位数(即认为n为小数之后的小数不重要),X为乘法结果的整数部分。
此处将n取16,得
X = 41943d = 1010_0011_1101_0111b
即0.64的二进制表示在左移了16位后为1010_0011_1101_0111b,因此可以认为0.64d = 0.1010_0011_1101_0111b 与查询结果一致。
再实验n取12,得
X = 2621d = 1010_0011_1101b 即 0.64d = 0.1010_0011_1101b,在忽略12位小数之后的位数情况下,计算结果相同。
3.纯小数的补码
纯小数的补码遵循的规则是:在得到小数的源码后,小数点前1位表示符号,从最低(右)位起,找到第一个“1”照写,之后“见1写0,见0写1”。
以-0.64为例,其原码为1.1010_0011_1101_0111b
则补码为:1.0101_1100_0010_1001b
当然在硬件语言如verilog中二进制表示时不可能带有小数点(事实上不知道哪里可以带小数点)。
4.一般带小数的补码
一般来说这种情况下先转为整数运算比较方便
-97.64为例,经查询其原码为1110_0001.1010_0011_1101_0111b
笔算过程:
-97.64 * 2^16 = -6398935 = 1110_0001_1010_0011_1101_0111b,其中小数点在右数第16位,与查询结果一致。
则其补码为1001_1110_0101_1100_0010_1001b,在此采用 负数的补码 = {原码符号位不变} + {数值位按位取反后+1} 方法
5.补码得到原码
方法:符号位不动,幅度值取反+1 or符号位不动,幅度值-1取反
-97.64补码 = 1001_1110(.)0101_1100_0010_1001b
取反 = 1110_0001(.)1010_0011_1101_0110b
+1 = 1110_0001(.)1010_0011_1101_0111b 与查询结果一致
6.补码的拓展
在运算时必要时要对二进制补码进行数位拓展,此时应将符号位向前拓展。
-5补码 = 4'b1011 = 6'b11_1011
ps.原码的拓展是将符号位提到最前面,然后在拓展位上部0.
-5原码 = 4‘b’1101 = 6'b10_0101,对其求补码得6'b11_1011,与上文一致。
-
二进制原码和补码的转换
2020-08-24 10:18:321.概念理解(注意正数的反码和补码就是原码,负数的补码是反码加1) 正数:原码=反码=补码 正数举例(数字3):11(原码)=11(反码)=11(补码) 负数:原码取反=反码;反码+1=补码 负数举例(数字-3):111(原码)-... -
二进制数的补码及运算
2019-04-22 12:00:47二进制十进制小数部分的转化 1.正数的补码表示 正数的补码 = 原码 负数的补码 = {原码符号位不变} + {数值位按位取反后+1} or = {原码符号位不变} + {数值位从右边数第一个1及其右边的0保持不变,左边安位取反... -
二进制原码反码补码.docx
2019-10-15 17:13:02此文用于教学给学生看,欢迎专业人士来拍砖指正,避免本人陷于无知而不自知。 -
二进制 原码 反码 补码
2019-12-23 17:56:151、原码,反码和补码概念 正数:原码、反码、补码相同; 以123为例: 原码:01111011 反码:01111011 ...--负数的补码即为负数的二进制数。 以-123为例: 原码:11111011,其中最高位1为符号位。 ... -
二进制原码和补码
2018-11-26 11:03:29当原码为正数的时候,正数的原码反码补码都相同,即...现代计算机多数以二进制补码的形式来存放整数。简单的说,一个二进制数的每一位对应了一个权值,从最低为到最高位,权值依次是1、2、4、8、16……以此类推。其... -
二进制中补码计算简单详实的讲解
2019-02-09 19:08:00本文说明一个基本的问题,补码的问题。 需要说明一点补码是对负整数在计算机中存储的一种形式;另一种形式是负数在计算机中可以用符号+负数绝对值的形式表示一个负数;比如(-3: 1000 0011存储)但是这种表示的负数... -
二进制补码、小数的补码及运算规则
2015-05-11 15:43:20针对补码这个常见的概念,引申到小数的补码,并且用实例说明其运算规则。 -
二进制的补码
2020-09-14 17:09:50那就是X小于Y,那么结果肯定是个负数了,我们采用二进制的补码的逆运算,求出它对应的正绝对值,再在前面加一个负号就可以了 第一步:计算Z、X、Y的二进制补码的表达式 Z = -((11111111 - Z) + 1);X = (11111111 - ... -
十进制、二进制补码、16进制补码的转换
2021-01-17 17:26:25今天一场技术笔试一道编程题难住了我,算出一个十进制数的二进制补码和对应的16进制,由于时间紧张,加上紧张,做的极差,因此mark以下 -
十六进制取补码转十进制
2015-12-15 15:49:04十个八位十六进制数字,装换为二进制,然后取其补码,然后求其平均值。用c编写,代码稍微有点问题,大家可以完善下 -
有符号二进制数--补码
2017-06-20 17:31:30有符号二进制数原码,反码,补码 -
二进制补码和十进制数的转换
2020-04-03 23:24:58先考虑如何将二进制补码转换为十进制整数: 若符号位是0, 则该数是正数, 原码等同于补码. 可以由原码(也就是补码)得知代表的正整数. 若符号为是1, 则该数一定是负数, 可按照以下方式转换: 方式一: 先把符号位去掉, ... -
二进制数表示形式:原码、反码与补码
2022-02-13 09:30:26二进制运算、二进制数表示:原码、反码和补码 -
有符号十进制数向任意格式定点补码二进制数据转化matlab源码
2021-08-02 22:02:191、此matlab文件可以实现有符号十进制数向任意格式定点补码二进制数据的转化:例如 fix16_13格式的定点二进制转化 ,-1.75:'1100100000000000' 0.75:'0001100000000000' 2、如果对定点数据格式不清楚的话,此处... -
二进制数的反码和补码
2019-01-16 22:12:54在大学的学习中,一开始自认为已经学会了反码与补码,但在看到多种表述之后,...首先从最一般的意义上,分别说一下二进制的反码和补码: 1、反码 1’s complement 把所有的0变为1,所有的1变为0。 如: 10110010 B... -
16进制数(负数)如何求补码
2021-04-26 21:21:12例如数学上,1+(-1)=0,而在二进制中00000001+ 10000001=10000010,换算成十进制为-10,错误。 但是采用他们的补码:00000001+11111111=00000000. 则可以进行正常的直接加减运算。 所以:对于求补码问题。 正数 -
十进制数和补码之间的相互转换
2020-03-30 16:21:03前言 这么久过去了,对了补码的概念还是...补码转十进制数的实现 (说不定要要用上呢) 从看过的文章中学来的,与普通2进制数转10进制数的过程几乎一样,但是第一位的计算要乘上(-1)。 Eg. 1111 = -1×1×23 + 1×2... -
二进制之补码与小数
2021-06-05 16:46:22牛逼的二进制 1.前言 计算机使用二进制来表示所有形式的数据:颜色、文字、图像等。当前辈们想方设法要造一台计算机时都会遇到一个问题:怎么...而补数就是用正数表示负数,一个正数的补数就是它的负数,所以二进制数与它 -
java基础 二进制补码
2021-02-12 23:25:41二进制补码:1、计算机系统的内部以二进制形式存储数据。2、在Java程序中输入的十进制的数据都会被自动转换为二进制,Java内部也以二进制来进行数值运算,但返回的结果是十进制。二进制补码的原理:正数+负数=模。模... -
负数的二进制表示-补码
2020-04-07 14:51:201 有符号整数和无符号整数 ...另:对具有相同字节数的整型数而言,由于有符号整数的数据位比无符号整数的数据位少了1位,而且少的这一位恰好是最高位,因此有符号整数能表示的最大整数的绝对值只有最大... -
二进制、16进制、补码
2019-09-11 16:53:33二进制 逢2进1的计数规则 格式:编写时要加0b int 0b //输出2进制: Integer.toBinaryString(); System.out.println(Integer.toBinaryString(n)); //输出10进制: Integer.toString(); System.out.... -
二进制原码,补码,与无符号数
2019-09-08 09:27:39无符号数,2的补码,原码 1. 无符号数 例如:四位无符号数 十进制:1 无符号数:0001 十进制: 2 无符号数:0010 2. 原码(有符号数) 最高位用于表示正负号,0表示正,1表示负。 所以,表示正数时原码与无符号数... -
二进制移位、补码
2019-07-11 18:00:31针对存储在计算机中中二进制的操作,正数在计算机中是用二进制表示的,负数在计算机中使用补码表示的。 先说明补码: 说明下-5怎么用二进制表示就明白补码的问题了: 5转化为二进制是101,八位的话为:00000101 然后...