【007】C++数据类型之原码、补码、反码

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

引言


💡 作者简介:专注于C/C++高性能程序设计和开发,理论与代码实践结合,让世界没有难学的技术。包括C/C++、Linux、MySQL、Redis、TCP/IP、协程、网络编程等。
👉
🎖️ CSDN实力新星,社区专家博主
👉
🔔 专栏介绍:从零到c++精通的学习之路。内容包括C++基础编程、中级编程、高级编程;掌握各个知识点。
👉
🔔 专栏地址:C++从零开始到精通
👉
🔔 博客主页:https://blog.csdn.net/Long_xu


🔔 上一篇:【006】C++数据类型之进制间的转换

🔔 下一篇:【008】C++数据类型之重要关键字详解

一、原码、补码、反码的概述

计算机存储的是数据的补码。

  • 原码:计算机中对数字的二进制定点表示方法。比如123的原码是0111 1011。

  • 无符号数:原码=反码=补码。

  • 有符号数:要分正数和负数,正数的最高位为0,负数的最高位为1。其中,正数的原码、反码、补码都是相同的;负数的反码等于原码的符号数(最高位)不变,其他位取反;补码等于反码+1。
    比如:-123的原码是1111 1011,反码为1000 0100,补码为1000 0101。

原码、补码和反码都是用于计算机表示有符号整数的方法。

  • 原码:最高位表示符号位,0为正数,1为负数,其余位表示数值。例如,+3的8位原码为00000011,-3的8位原码为10000011。

  • 反码:在原码基础上,负数的表示方法改为将除了符号位以外的所有位取反(即0变1,1变0)。例如,-3的8位反码为11111100。

  • 补码:在反码基础上再加1得到的结果,即负数的补码是其对应正数的原码按位取反再加1。例如,-3的8位补码为11111101。

负数在计算机中以补码形式存储;非负数在计算机中以原码形式存储。

二、为什么要使用补码?

使用补码可以简化计算机中的运算逻辑,同时还能避免原码和反码中出现的“零”问题,即正数的反码和补码等于原码,而负数的反码和补码不等于原码,因此没有正零和负零的区别。

(1)统一了 0 的编码:

+0补码:0000 0000
-0补码:0000 0000

(2)将减法运算变加法运算:

// 没有补码的情况
100000 1010
-61000 0110
---------------
---- 1001 0000
// 结果是16,有问题
// 有了补码
100000 1010
-61111 1010
---------------
---- 0000 0100
// 溢出位会被移除,结果等于4,满足运算结果

三、对数据的存

负数在计算机中以补码的方式存储。

非负数、八进制数、十六进制数等在计算机以原码的方式存储。

示例:

#include <iostream>
#include <bitset>

using namespace std;

int main()
{
	short data=-10;
	cout<<bitset<16>(data)<<endl;
	data=10;
	cout<<bitset<16>(data)<<endl;
	data=0x80;
	cout<<bitset<16>(data)<<endl;
	return 0;
}

输出:

1111111111110110
0000000000001010
0000000010000000

四、对数据的取

  • 如果是对无符号变量进行取值,输出内存的原样数据。
  • 如果是对有符号变量进行取值,系统会去看内存的最高位,如果最高位为0表明是正数,内存原样输出。如果最高位是1表示负数,将内存数据求补码(得到原码)输出。

示例:

#include <iostream>
#include <bitset>

using namespace std;

int main()
{
	unsigned short data = -10;
	cout << bitset<16>(data) << endl;
	cout << dec << data << endl;
	data = 10;
	cout << bitset<16>(data) << endl;
	cout << dec << data << endl;
	short data2 = 0x8080;
	cout << bitset<16>(data2) << endl;
	cout << data2 << endl;
	return 0;
}

输出:

1111111111110110
65526
0000000000001010
10
1000000010000000
-32640

总结

原码是数值的二进制表示方法,其中最高位表示符号位,0表示正数,1表示负数。

补码是为了解决原码运算中存在的符号位带来的问题而提出的一种方法。在补码中,正数的补码与原码相同,而负数的补码则是其对应正数的反码加1。

反码也是为了解决原码运算中存在的符号位带来的问题而提出的一种方法。在反码中,正数的反码与原码相同,而负数的反码则是将其对应正数的二进制表示中每一位取反。但是,反码存在一个问题:它有两个0表示+0和-0,这会导致计算机在进行数学运算时出现不确定性。

总之,补码是目前计算机内部存储和运算使用的一种数值表示方法,因为它可以避免出现不确定性的情况。而原码和反码则只在理论上有一定的意义,在实际编程中很少使用。
【007】C++数据类型之原码、补码、反码文章来源地址https://www.toymoban.com/news/detail-451697.html

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

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

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

相关文章

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

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

    2024年02月15日
    浏览(47)
  • 原码,反码,补码,移码

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

    2024年02月08日
    浏览(38)
  • 原码,反码,补码

            原码、反码和补码是计算机中表示有符号整数的三种不同的二进制表示形式。它们的理解和原理涉及了计算机内部整数表示的数学概念和编码规则。 十进制数 原码 反码 补码 +5 00000101 00000101 00000101 +4 00000100 00000100 00000100 +3 00000011 00000011 00000011 +2 00000010 00000010 0000001

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

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

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

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

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

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

    2024年02月08日
    浏览(99)
  • 补码的反码加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日
    浏览(34)
  • 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日
    浏览(43)
  • verilog学习笔记5——进制和码制、原码/反码/补码

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

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

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

    2024年02月02日
    浏览(50)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包