————————————————————————————————————————-
观看视频ing……
12岁的少年编程者告诉你编程如此简单
————————————————————————————————————————-
————————————————————————————————————————-
作者:Yu仙笙真滴卷
(也欢迎大家关注博主emm)如果你要问为什么那么多“-”号,那我就告诉你,借鉴了别人的做法,因为我自己看别人这么写文章时,会情不自禁的把“-”号包围的知识点看清楚,而且更好的划分层次,但是疑问比较多的你,又问了一个问题,为什么不用水平线,答:因为太浅了,不好集中知识点,大模块的分区我会使用水平线隔开。嗯就是这样。
————————————————————————————————————————-
专栏:C++知识精讲(欢迎大家订阅)点击我进入专栏订阅哦https://blog.csdn.net/djfihhfs/category_11952565.html?spm=1001.2014.3001.5482
本专栏前几期内容:(点击直接转跳)
C++知识精讲1——八个皇后(搜索与回溯)
C++知识精讲2——马的遍历(搜索与回溯)
C++知识精讲3——时间戳(基本类型)
C++知识精讲4——abs函数以及实战运用
C++知识精讲5——printf()函数保留小数点位数方法及实战运用基本方式
C++知识精讲6——角gu猜想
C++知识精讲7——scanf函数基本用法及实战运用(外加一点点比赛经验,非常实用)
C++知识精讲8——gcd函数使用方法及实战讲解(例题为求最大公约数)
C++知识精讲9——sqrt函数函数基本使用方法以及实战讲解
C++知识精讲10——递增序列双循环条件语句位运算写法(基本方法,后面的知识精讲会出详细的位运算讲解)
C++知识精讲11——字母大小写转换讲解(单个字母基础版)
C++知识精讲12——取整方式及实战讲解【全网最详细取整“集合”】
————————————————————————————————————————-
文章简介:
本文我们来讲C++知识精讲的第14篇,原码、反码和补码,此专栏会讲许多,各种各样的类型,如果喜欢此专栏请订阅持续关注,感谢大家的支持。接下来,进入今天的知识精讲——原码、反码和补码。
————————————————————————————————————————-
本文的重点在于第二模块——Second·数的原码、反码和补码部分,建议阅读第一部分,可以提升对知识点的理解,本文还附带各年CSP相关知识点真题,帮助大家巩固运用
————————————————————————————————————————-
文章目录:
First~机器数和真值(学习原码、反码、补码必学知识点)
————————————————————————————————————————-
(1)~机器数
——————————————————————————————————————
(2)~真值
——————————————————————————————————————
Second·数的原码、反码和补码表示以及之间的互相转换
————————————————————————————————————————-
(1)~原码
——————————————————————————————————————
(2)~反码
——————————————————————————————————————
(3)~补码
——————————————————————————————————————
(4)~负数的补码反码原码反转换
——————————————————————————————————————
Third~历年CSP相关知识点课堂练习题(附带答案及解析)
————————————————————————————————————————-
单选:
——————————————————————————————————————
多选:
——————————————————————————————————————
课外拓展(编程题/C++)
——————————————————————————————————————
Fourth~大总结(知识点凝练本文精髓
————————————————————————————————————————-
————————————————————————————————————————-
First~机器数和真值(学习原码、反码、补码必学知识点)
在学习0原码、反码和补码之前,我们需要先了解机器数和真值的概念。
我会将重要的知识点标红处理,方便读者大大记忆和观看。
————————————————————————————————————————-
(1)~机器数
一个数在计算机中的二进制表示的形式,叫做这个数的机器数。机器数是带有符号的,在计算机用一个数的最高位存放的符号,正数为0,负数为1。
如果还不理解的话,那就举个栗子来看看吧:
比如十进制的+3,计算机字长为8位,转换成二进制就是00000011,如果是-3,那就是10000011。这样大家就可以发现,正数,他的二进制数最高位是0,也就代表正数;负数,他的二进制数最高位是1,也就代表负数
那么,这里的00000011和10000011就是机器数
————————————————————————————————————————-
(2)~真值
机器数的第一位是符号,后边才是真正的数值,所以机器数的形式值就不等于真正的数值。例如:上面的有符号的数10000011,它的最高位1代表负的,它的真正的数值是-3而不是形式值131(10000011转换成十进制等于131)。所以,为了区别起见,将带有符号位的机器数所对应的真正的数值成为机器数的真值。
如果还不理解的话,那就举个栗子来看看吧:
- 00000001的真值= +0000001 = +1;
- 10000001的真值= -0000001 = -1。
那么恭喜您已经成功学会了机器数和数值了,相信您也能完全掌握并且分清这两个术语了,so接下来就正式开启我们对原码、反码和补码的学习之旅了
————————————————————————————————————————-
————————————————————————————————————————-
Second·数的原码、反码和补码表示以及之间的互相转换
原码、反码和补码是计算机存储的一个具体的数字的编码方式。数值在计算机中是以补码的方式存储的。
————————————————————————————————————————-
(1)~原码
原码就是在符号位上加上真值的绝对值,也就是第一位表示的符号,其余的位表示值。比如如果是8位二进制:
- [+1]=[00000001]原码;
- [-1]=[10000001]原码;
第一位是符号位。因为第一位是符号位,所以8位二进制数的取值范围就是:
————————————————————————————————————————-
(2)~反码
反码的表示方法很简单,这边作者给大家整理了一下反码表示规则:
按照表格进行运算即可
正负 表示方法 正数(+) 正数的反码就是其本身 负数(-) 负数的反码就是在其原码的基础上,符号位不变,其余每个位都取反(取反的意思就是0变1;1变0) 这样子比较抽象,让我们来举个栗子:
- [+1]=[00000001]原码=[00000001]反码;
- [-1]=[10000001]原码=[11111110]反码;
————————————————————————————————————————-
(3)~补码
补码的表示方法也很easy,这边作者又给大家整理了一下补码表示规则:
按照表格进行运算即可
正负 表示方法 正数(+) 正数的补码就是其本身 负数(-) 负数的补码就是在其原码的基础上,符号位不变,其余每个位都取反,最后+1(也就是在反码的基础上+1) 这样子比较抽象,让我们来举个栗子:
- [+1]=[00000001]原码=[00000001]反码=[00000001]补码;
- [-1]=[10000001]原码=[11111110]反码=[11111111]补码;
————————————————————————————————————————-
(4)~负数的补码反码原码反转换
直接逆运算上述的公式即可
举个栗子:
- [-1]=[10000001]原码=[11111110]反码=[11111111]补码;
- [11111111]补码(-1)=[11111110]反码(取反)=[10000001]原码;
这就很一目了然了
but
作者有一个其他的的方法【先补码转原码再原码转反码】(自己发现的不知道有没有人发现过,反正我自己总结了)
真相只有一个
让我们来康康:
- [11111111]补码(取反+1)=[10000001]原码(取反)=[11111110]反码;
这也是另一种方法
————————————————————————————————————————-
这其实也很考察大家的举一反三能力和对知识点的灵活运用
Third~历年CSP相关知识点课堂练习题(附带答案及解析)
————————————————————————————————————————-
单选:
————————————————————————————————————————-
1.【NOIP2019】在字长为16位的系统环境下,一个16位带符号整数的二进制补码位1111111111101101。其对应的十进制整数应该为()
A.19B.-19C.18D.-18
————————————————————————————————————————-
认真做题ing…………
————————————————————————————————————————-
【答案】
A.19B.-19C.18D.-18
————————————————————————————————————————-
【解析】由补码的定义可以得知二进制数(1111111111101101)二进制与其十进制的真值X的关系为2的16次方+X(1111111111101101)二进制,X= -[2的16次方-(1111111111101101)二进制]= -(65536-65517)= -19。
————————————————————————————————————————-
————————————————————————————————————————-
2.【NOIP2010】一个字长为8位的整数的补码为11111001,则他的原码是()
A.00000111 B.01111001C.11111001 D.10000111
————————————————————————————————————————-
认真做题ing…………
————————————————————————————————————————-
【答案】
A.00000111 B.01111001C.11111001 D.10000111
————————————————————————————————————————-
【解析】正数的补码与反码相同。负数的补码符号位位1,其余的位为该数的绝对值的原码按位取反然后整个数加1.11111001的第一位1,作为符号位代表该数为负数,所以保留该位。1111001减1然后取反,再加上符号位1,结果是10000111。
————————————————————————————————————————-
3. 【NOIP2017】在8位二进制补码中,10101011表示的数是十进制下的()
A.43 B.-85 C.-43D.-84
————————————————————————————————————————-
认真做题ing……
————————————————————————————————————————-
【答案】
A.43 B.-85 C.-43D.-84
————————————————————————————————————————-
【解析】考察补码的概念以及进制的转换。首位1也就是表示为负数,负数的补码的原码为补码-1后取反,也就是说原码应该为补码取反后加一,也就是(1010101)二进制,对应的数值为85,所以该数字为-85。
————————————————————————————————————————-
————————————————————————————————————————-
多选:
————————————————————————————————————————-
1. 【NOIP2010】在整数的补码表示法中,以下说法正确的是()
A.只有负整数的编码最高位为1。
B. 在编码的位数确定后,所能表示的最小的整数和最大的整数的绝对值相同。
C.整数0只有一个唯一的编码。
D.两个用补码表示的数相加时,若在最高位产生进位,则表示运算溢出。
————————————————————————————————————————-
认真做题ing……
————————————————————————————————————————-
【答案】
A.只有负整数的编码最高位为1。
B. 在编码的位数确定后,所能表示的最小的整数和最大的整数的绝对值相同。
C.整数0只有一个唯一的编码。
D.两个用补码表示的数相加时,若在最高位产生进位,则表示运算溢出。
————————————————————————————————————————-
【解析】8位所对应的范围为-128~127。-1+(-1)用补码表示为11111111+11111111=11111110,11111110是-2的补码。
————————————————————————————————————————-
课外拓展(编程题/C++)
————————————————————————————————————————-
题目:
————————————————————————————————————————-
用C++求得数据的原码、反码、补码。
————————————————————————————————————————-
代码实现:
———————————————————————————————————————————
#includeusing namespace std;#include#include"value.h"void test1(){int a;cin >> a; vectorv;binary(a, v); cout << "原码:" << endl;printVector(v); inverseCode(v); cout << "反码:" << endl;printVector(v); complement(v); cout << "补码:" << endl;printVector(v);} int main(){test1();}
————————————————————————————————————————-
Fourth~大总结(知识点凝练本文精髓)
————————————————————————————————————————-
在计算机里存储的是补码。
————————————————————————————————————————-
原码反码补码的转换:
正数原码与反码相同,补码和反码相同so(
原码和补码也相同emm……)负数原码转反码,第一位符号位不变,其他位取反(取反的意思就是0变1;1变0),反码变补码就是在反码的基础上加1。
————————————————————————————————————————-
负数的补码反码原码反装换就是-1最高位符号位不动,然后取反(取反的意思就是0变1;1变0)也就是他们的逆运算。
也可以补码先转原码再转换反码。
————————————————————————————————————————-
好了今天的知识精讲就给大家分享到这了,感谢大家观看C++知识精讲的第14篇,原码、反码和补码,如果有疑问在评论区留下你的疑问(或私信博主),作者看到后,会一一为大家答疑解惑的。
————————————————————————————————————————-