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

news2024/9/23 5:25:58

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

  • 引言
  • 一、原码、补码、反码的概述
  • 二、为什么要使用补码?
  • 三、对数据的存
  • 四、对数据的取
  • 总结

引言


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


🔔 上一篇:【006】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,这会导致计算机在进行数学运算时出现不确定性。

总之,补码是目前计算机内部存储和运算使用的一种数值表示方法,因为它可以避免出现不确定性的情况。而原码和反码则只在理论上有一定的意义,在实际编程中很少使用。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/547066.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

KingbaseES V8R3 集群运维案例--sys_rewind恢复备库节点

​ 案例说明&#xff1a; 在KingbaseES V8R3集群执行failover切换后&#xff0c;原主库被人为误(未配置recovery.conf)启动&#xff1b;或者人为promote备库为主库后。需要将操作节点再重新加入集群&#xff0c;此时节点与主库的timeline将出现分叉&#xff0c;导致节点直接加入…

ChatGLM-6B 本地部署指南!

Datawhale干货 作者&#xff1a;宋志学&#xff0c;Datawhale成员 注意事项-写在最前 显卡需要至少6GB的显存使用GPU部署模型需要自行安装torch和与自己显卡匹配的CUDA、cudnn 下载ChatGLM-6B 在GitHub上下载chatglm-6b的源码&#xff0c;地址如下 https://github.com/THUDM/C…

信息安全-应用安全-SCA技术:SBOM应用实践初探

目录 软件供应链安全治理 供应链安全概述 风险治理重点 何为SBOM SBOM的元素 SBOM的格式 SBOM使用场景 如何使用SBOM 选择SBOM工具 SBOM与风险情报关联 围绕SBOM建立管理流程 关于SBOM的思考 现代软件都是组装的而非纯自研。随着开源组件在数字化应用中的使用比例越…

【C++】运算符重载与赋值运算符重载(显式与默认)的特性与格式以及前置++,后置++重载

文章目录 前言一、运算符重载二、赋值运算符重载1. 赋值运算符重载格式&#xff1a;2. 用户没有显式实现时&#xff0c;编译器会生成一个默认赋值运算符重载&#xff0c;以值的方式逐字节拷贝。3. 赋值运算符只能重载成类的成员函数不能重载成全局函数 三、前置与后置 前言 C为…

【Linux】Linux小程序-进度条

目录 一、\r和\n的理解 二、行缓冲区概念 三、进度条源代码 一、\r和\n的理解 \r&#xff1a;回车&#xff1b; \n&#xff1a;换行&#xff1b; 那么请问这两个有什么区别呢&#xff1f; 比如&#xff1a;我们在编写内容的时候&#xff0c;一行没有写完的情况下&#xff0c;需…

【信息安全案例】——软件解密技术(以OllyDbg为例)

目录 &#x1f552; 1. 软件解密技术&#x1f558; 1.1 概述&#x1f558; 1.2 爆破&#x1f558; 1.3 跟踪注册&#x1f558; 1.4 写出注册 &#x1f552; 2. 破解相关问题&#x1f558; 2.1 破解程度&#x1f558; 2.2 破解线索 &#x1f552; 3. 实验&#xff1a;使用 OllyD…

分布式系统原理

高可用是指系统无中断的执行功能的能力&#xff0c;代表了系统的可用程度&#xff0c;是进行系统设计时必须要遵守的准则之一。 而高可用的实现方案&#xff0c;无外乎就是冗余&#xff0c;就存储的高可用而言&#xff0c;问题不在于如何进行数据备份&#xff0c;而在于如何规避…

MacOS Ventura 13.4 (22F66) 带 OC 引导双分区黑苹果镜像

苹果今日向 Mac 电脑用户推送了 macOS 13.4 更新&#xff08;内部版本号&#xff1a;22F66&#xff09;&#xff0c;本次更新距离上次发布隔了 41 天&#xff0c;主要解决了与Apple Watch自动解锁、蓝牙键盘、屏幕使用时间和VoiceOver相关的问题&#xff0c;推荐大家安装升级。…

Vue 级联组件添加按钮并添加点击事件加传参

我这里采用的是jqvue实现的此功能&#xff0c;首先是要把按钮追加进去&#xff0c;当然头开始写真实dom会导致页面上也追加显示&#xff0c;但是我想实现的是在级联组件上追加所以&#xff0c;选择创建虚拟dom&#xff0c;然后传参这点实在是研究试错了半天&#xff0c;最后选择…

聚观早报|ChatGPT 推出官方 iOS App;大疆称将接收OPPO哲库工程师

今日要闻&#xff1a;ChatGPT 推出官方 iOS App&#xff1b;大疆称将接收OPPO哲库工程师&#xff1b;菜鸟、盒马启动上市计划&#xff1b;苹果公司限制员工使用ChatGPT&#xff1b;张勇&#xff1a;阿里云将分拆上市 ChatGPT 推出官方 iOS App 北京时间 5 月 19 日&#xff0c…

苹果扩充AirTag应用场景,苹果Find My应用更加广泛

根据美国商标和专利局&#xff08;USPTO&#xff09;公示的清单&#xff0c;苹果近日获得了一项技术专利&#xff0c;将追踪器附着人体或者服装上&#xff0c;从而监测健康和活动数据。 AirTag 不仅可以追踪某件事物之外&#xff0c;还可以通过安装在人体的不同位置&#xff0c…

人工智能本来是个很简单的事,咋被人们整的这么神秘?

&#xff08;1&#xff09; 很多人以为大模型的参数量大是因为数据多。 其实大模型的参数量和超参数的配置相关。主要的超参数有下面几个&#xff1a; 词表大小&#xff1a;Vocab_Size最大位置编码大小&#xff1a;Max_Position_embeddings隐层节点数大小&#xff1a;Hidden_Si…

Linux - 第16节 - 网络基础(应用层二)

1.HTTP协议 我们在套接字部分编写的代码和应用层一中编写的网络计算器代码都是在应用层工作的&#xff0c;是应用层代码&#xff0c;因此应用层代码包括&#xff1a; &#xff08;1&#xff09;基本系统socket套接字系列接口的使用。 &#xff08;2&#xff09;定制协议&#x…

一个炎爆术分享给大家~

先来强势围观&#xff1a; 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script src"https://cdnjs.cloudflare.com/ajax/libs/three.js/r120/…

23种设计模式之外观模式(Facade Pattern)

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章将23种设计模式中的外观模式&#xff0c;此篇文章为一天学习一个设计模式系列文章&#xff0c;后面会分享其他模式知识。 如果文章有什么需要改进的地方还请大佬不…

云从科技从容大模型:大模型和AI平台什么关系?为什么造行业大模型?

原创&#xff1a;亲爱的数据 2023年5月18日&#xff0c;坐标广州南沙&#xff0c;来自云从科技的“云从从容大模型”正式亮相。 自此&#xff0c;云从科技从CV四小龙“进阶”成为一家AI大模型公司&#xff0c;同时&#xff0c;别忘记云从还有一个身份常被人提起&#xff1a;首家…

纯虚函数与抽象类

纯虚函数与抽象类 虚析构函数状态转换的引入C中的状态转换C中的状态转换职责链模式 纯虚函数和虚基类使用规则实例接口继承和实现继承 虚析构函数 在上一次博客中写到了这么一段代码&#xff1a; class object { private: int value;public:object(int x 0) : value(x) {}~o…

嵌入式音视频开发过程中如何控制码率?

一、码率控制的意义&#xff1a; 在音视频领域&#xff0c;码率控制模式有着举足轻重的地位。那什么是码率控制&#xff1f;码率控制是指通过调节图像的压缩比例&#xff0c;从而决定输出编码码率的过程。 二、H264有多少种码率控制模式&#xff1a; H264码率控制模式分别有&am…

DailyMart01:一点小想法,一个新的开始!

大家好呀&#xff0c;我是飘渺&#xff01; 截至目前&#xff0c;我已在公众号和知识星球上发布了多个系列文章&#xff0c;涵盖了SpringBoot老鸟系列、SpringCloud微服务系列、运维监控系列、分库分表系列和Kubernetes云原生系列。尽管每个系列的重点各有不同&#xff0c;它们…

【MYSQL】事务的4大属性,对隔离级别的详细讲解

目录 1.原子性和持久性 1.1.手动提交事务 1.2.自动提交事务 1.3.事务的原理&#xff1a; 2.隔离性 1.读未提交&#xff08;Read Uncommitted&#xff09; 2.读提交&#xff08;Read Committed&#xff09; 3.可重复读 4.串行化 3.一致性 4.理解读提交和可重复读的实现…