C++知识精讲13 | 原码、反码和补码

这篇具有很好参考价值的文章主要介绍了C++知识精讲13 | 原码、反码和补码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

-------------------------------------------------------------------------------------------------------------------------文章来源地址https://www.toymoban.com/news/detail-595546.html

观看视频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.19                                  B.-19                                C.18                                D.-18

-------------------------------------------------------------------------------------------------------------------------

认真做题ing…………

-------------------------------------------------------------------------------------------------------------------------

【答案】

A.19                                  B.-19                                C.18                                D.-18

-------------------------------------------------------------------------------------------------------------------------

【解析】由补码的定义可以得知二进制数(1111111111101101)二进制与其十进制的真值X的关系为2的16次方+X(1111111111101101)二进制,X= -[2的16次方-(1111111111101101)二进制]= -(65536-65517)= -19。

-------------------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------------------

2.【NOIP2010】一个字长为8位的整数的补码为11111001,则他的原码是()

A.00000111                  B.01111001                    C.11111001                               D.10000111

-------------------------------------------------------------------------------------------------------------------------

认真做题ing............

-------------------------------------------------------------------------------------------------------------------------

【答案】

A.00000111                  B.01111001                    C.11111001                               D.10000111

-------------------------------------------------------------------------------------------------------------------------

【解析】正数的补码与反码相同。负数的补码符号位位1,其余的位为该数的绝对值的原码按位取反然后整个数加1.11111001的第一位1,作为符号位代表该数为负数,所以保留该位。1111001减1然后取反,再加上符号位1,结果是10000111。

-------------------------------------------------------------------------------------------------------------------------

3. 【NOIP2017】在8位二进制补码中,10101011表示的数是十进制下的()

A.43                                  B.-85                               C.-43                                D.-84

-------------------------------------------------------------------------------------------------------------------------

认真做题ing……

-------------------------------------------------------------------------------------------------------------------------

【答案】

A.43                                  B.-85                               C.-43                                D.-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++求得数据的原码、反码、补码。

-------------------------------------------------------------------------------------------------------------------------

代码实现:

---------------------------------------------------------------------------------------------------------------------------------

#include<iostream>
using namespace std;
#include<vector>
#include"value.h"
void test1()
{
	int a;
	cin >> a;
 vector<bool>v;
	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篇,原码、反码和补码,如果有疑问在评论区留下你的疑问(或私信博主),作者看到后,会一一为大家答疑解惑的。

-------------------------------------------------------------------------------------------------------------------------

到了这里,关于C++知识精讲13 | 原码、反码和补码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 原码,反码,补码,移码

    原码、反码、补码和移码是在计算机中表示有符号整数的方法。它们是为了处理正负数的运算和表示而设计的。下面我会逐个解释这些概念,并说明它们的使用和理解。 原码(Sign-Magnitude Representation): 原码是最简单的表示方法,其中最高位表示符号(0代表正数,1代表负数

    2024年02月08日
    浏览(10)
  • 什么是原码、反码和补码

    什么是原码、反码和补码

    前言 一个数在计算机中的表示形式是二进制的话,这个数其实就叫机器数。 机器数通常是带有符号的(指有正数和负数之分),计算机用最高位存放符号,这个 bit 一般叫做符号位。 正数的符号位为 0, 负数的符号位为 1。比如,十进制中的数 +7 ,计算机字长为8位,转换成

    2023年04月09日
    浏览(9)
  • 原码、补码、反码的关系及应用场景

    是三种表示有符号整数的方法,它们之间存在一定的关系。 原码 是最基本的表示方法,即将一个数的符号位和数值位分开表示,符号位用0表示正数,用1表示负数。例如,+7的原码为00000111,-7的原码为10000111。 反码 是在原码的基础上,将负数的数值位按位取反得到的表示方

    2024年02月06日
    浏览(12)
  • List 3.5 详解原码、反码、补码

    List 3.5 详解原码、反码、补码

    本博客文章已收录至我的Java SE专栏,如需阅读其他有关博客笔记请转至该专栏下 传送门 --Java SE_程序员雨空集 目录  前言 原码 原码的示例 原码的弊端 反码 反码的示例 反码的弊端 补码 补码的示例 补码的小细节 总结 原码:十进制数据的二进制表现形式,最左边是符号位,

    2024年02月08日
    浏览(33)
  • 补码的反码加1为什么是原码?

    搞了半个小时,终于弄懂了。 16 8 4 2 1 原码 1 0 0 1 1 反码 0 1 1 0 0 补码 0 1 1 0 1 学到这里了,我们肯定知道,原码+补码 = 0,在这里也就是 = 19 + 13 = 32,溢出来的一位正好舍去了; 所以说,对啊,只要保证原码+补码 = 32(以此类推)不就好了吗! 所以,补码是 通过原码 这样得

    2024年02月10日
    浏览(13)
  • Java基础:进制之间的转换,8421码,原码,反码,补码

    1平时的数一般都是用十进制表示的 十进制: 12345=10000+2000+300+40+5 =1*10^4+2*10^3+3*10^2+4*10^1+5*10^0 =1*10000+2*1000+3*100+4*10+5*1 =10000+2000+300+40+5 =12345 十进制转换为其他进制: 整数除以要转换目标进制的基数,一直除完为止,再将它们的余数由下对上排列。 二进制由0,1组成,0b开头 八进

    2023年04月08日
    浏览(24)
  • verilog学习笔记5——进制和码制、原码/反码/补码

    verilog学习笔记5——进制和码制、原码/反码/补码

    2023.8.13 天气晴 整数:除以2,余数倒着写 小数:乘以2,正着写 例题1 : 例题2 : 十进制数13.613转化为二进制数,要求误差小于1% 乘以2的次方 乘法 :被乘数左移,后相加 除法 :除数右移,被除数/余数去减去除数 8位二进制数的范围: 有符号数 无符号数 -128~127 0~255 原码 反

    2024年02月13日
    浏览(10)
  • 位运算(按位与、按位或、异或、取反)以及原码、反码、补码

    位运算(按位与、按位或、异或、取反)以及原码、反码、补码

    目录 位运算 按位与运算符 [ ] 按位或运算符 [ | ] 异或运算符 [ ^ ] 取反运算符 [ ~ ] 移位操作 一些面试常考的位操作运算 获取二进制中最右边的1 计算机原码、反码、补码 机器数 “三码”之间的转换 计算机中为啥要用补码呢? 真数 原码 反码 补码 有了原码为什么要使用反码

    2024年02月02日
    浏览(10)
  • ⚡【C语言趣味教程】(2) 整数类型:数据类型的概念 | 原码反码与补码 | 有符号型和无符类型 | 研究 signed char 与 unsigned char 的取值范围

    ⚡【C语言趣味教程】(2) 整数类型:数据类型的概念 | 原码反码与补码 | 有符号型和无符类型 | 研究 signed char 与 unsigned char 的取值范围

      🔗 《C语言趣味教程》👈  猛戳订阅!!! 在讲解数据类型前,我们不得不先讲解一些必备的知识点,比如如何定义一个变量,数据类型的基本概念。并介绍 ASCII 码,为 char 类型的讲解做必要的铺垫。然后讲解原码反码和补码,讲解 IEEE754标准时需要这部分的知识作为基

    2024年02月16日
    浏览(9)
  • 【C语言趣味教程】(2) 整数类型 | 数据类型的概念 | 原码反码与补码 | 有符号型和无符类型 | 研究 signed char 与 unsigned char 的取值范围

    【C语言趣味教程】(2) 整数类型 | 数据类型的概念 | 原码反码与补码 | 有符号型和无符类型 | 研究 signed char 与 unsigned char 的取值范围

      🔗 《C语言趣味教程》👈  猛戳订阅!!! 在讲解数据类型前,我们不得不先讲解一些必备的知识点,比如如何定义一个变量,数据类型的基本概念。并介绍 ASCII 码,为 char 类型的讲解做必要的铺垫。然后讲解原码反码和补码,讲解 IEEE754标准时需要这部分的知识作为基

    2024年02月15日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包