BUG调试记录:C++中有符号类型和无符号类型在自动补位时的差异

news2024/11/25 0:23:48

BUG调试记录:C++中有符号类型和无符号类型在自动补位时的差异

  昨天和同事一起干活的过程中,项目中一个函数的计算结果出现了问题,即使我们反复对照流程图并进行了一系列的手算也没有发现任何编码上的差错,在逻辑上整个函数的编写是完全没问题的,因此我们开始直接单步,并最终定位到了问题的所在,其原因为C++中对于无符号数和有符号数进行自动补位时的不同处理,接下来我结合代码详细说明一下这个问题。

错误代码

    char a = 0xaa;
    short b = 0;
    b = b | a;

    std::cout << std::hex<< b << std::endl;

  解释:代码作者(不是我)写了一个或运算,在单步调试的时候作者发现只要过了这个或运算,数据就一定会出错。上边的代码就是我还原的他当时所写的代码的关键部分

  如上边的代码所示,他希望将一个数字“0xaa”和0作或运算,结果仍然是0xaa,在经常作位运算操作的人的意识海中,一个数字和0做或运算一定还是其本身,这是一种思维惯性,但是你可以尝试运行上边的代码,运算结果成为了一个非常大的数字,这里问题的关键就在于,进行运算的两个数字类型不同,因此在计算的时候存在低精度类型数字补位的行为,因此,在位运算中,低精度类型数字如何补位,便成为了问题关键。我们运行这个代码,能够发现结果如下:

在这里插入图片描述

  结果为0xffaa,因为变量b是精度高的一方,因此无需补位,因此只能是因为a在补位的时候,高位并为如预想的那样补0,而是补的1,因此补成2字节之后,它成为了0xffaa,现在我们来验证一下:

short b = 0xaa00;

b = b >> 8;
std::cout << std::hex<< b << std::endl;

  运行结果是0xffaa,至此我们可以认为在C++中,有符号数字在补位或者移位的时候,如果高位出现空缺,是直接补1的,那么是否和java一样,无符号数字的补位或者移位是补0呢:

 unsigned char a = 0xaa;
 short b = 0;
 b = b | a;
 std::cout << std::hex<< b << std::endl;

  运行结果如图:

在这里插入图片描述

  果然如预想的一样,接下来我们尝试一下移位:

    unsigned short b = 0xaa00;
    b = b >> 8;
    std::cout << std::hex<< b << std::endl;

  运行结果如下:

在这里插入图片描述

结论

  在C++中,变量类型存在有符号和无符号两种大类,这两大类变量类型中的整形变量在补位或者移位的时候,如果出现高位空缺需要补位的情况,如果是有符号数字,则补1,如果是无符号数字,则补0。

  这个问题可能在C++中是一个非常简单常见的问题,但由于本人是java出身,在java的变量类型中不存在无符号的概念,但是为了弥补这一点,在java的数字移位操作中,存在一个无符号移动和有符号移动,和C++中的不同类型变量的移动,补位不同表征相似。

  尽管这是一个小问题,并且在大多数面向需求的开发中,计算操作并不是很多,但是这种小的问题确实需要注意。

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

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

相关文章

【C++入门(7)】string

一、与C语言的联系 C的string类其实是从C语言的字符串演变过来的&#xff0c;是STL中用于处理字符串的一个容器。 在C语言中&#xff0c;字符串是以 \0 为结尾的一串字符&#xff0c;为了便于操作&#xff0c;C语言标准库中也提供了不少str系列的库函数供人使用。但是这些库函…

Java生成图片_基于Spring AI

Spring AI 优势 过去&#xff0c;使用Java编写AI应用时面临的主要困境是没有统一且标准的封装库&#xff0c;开发者需自行对接各个AI服务提供商的接口&#xff0c;导致代码复杂度高、迁移成本大。如今&#xff0c;Spring AI Alibaba的出现极大地缓解了这一问题&#xff0c;它提…

vue3之生命周期钩子

Vue 组件实例生命周期 每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤&#xff0c;比如设置好数据侦听&#xff0c;编译模板&#xff0c;挂载实例到 DOM&#xff0c;以及在数据改变时更新 DOM。在此过程中&#xff0c;它也会运行被称为生命周期钩子的函数&#xff0c…

基于Arduino的燃气泄漏检测系统与自动切断调节器

Arduino LPG燃气泄漏检测系统与自动切断调节器 引言 大家好&#xff0c;今天我要分享一个非常实用的项目——Arduino LPG燃气泄漏检测系统与自动切断调节器。这个项目的重要性不言而喻&#xff0c;因为燃气泄漏是一个严重的安全隐患。在厨房烹饪时&#xff0c;我们可能会忘记…

望繁信科技成功签约国显科技 流程挖掘助力制造业智造未来

近日&#xff0c;上海望繁信科技有限公司&#xff08;简称“望繁信科技”&#xff09;成功与深圳市国显科技有限公司&#xff08;简称“国显科技”&#xff09;达成合作。国显科技作为全球领先的TFT-LCD液晶显示及Mini/Micro LED显示产品供应商&#xff0c;致力于为笔记本、手机…

设计模式02-桥接模式(Java)

4.2 桥接模式 **1.定义&#xff1a;**将抽象与实现分离&#xff0c;使它们可以独立变化。它是用组合关系代替继承关系来实现&#xff0c;从而降低了抽象和实现这两个可变维度的耦合度。 2.结构&#xff1a; 抽象化角色 &#xff1a;定义抽象类&#xff0c;并包含一个对实现化…

Spring Security无脑使用

步骤1&#xff1a;添加Spring Security依赖 在你的Spring Boot项目的pom.xml文件中&#xff0c;添加Spring Security的依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</art…

数据库的特点

数据库是有组织的&#xff0c;规范的把数据保存起来的。 怎么个组织的&#xff0c;规范的&#xff1f; 数据库的特点&#xff1a; 1.将数据放到数据表格&#xff08;二维表&#xff09;中&#xff0c;在将表格放到库中。 2.一个数据库中可以有多张表&#xff0c;每个表都有一…

【OpenCV】(四)—— 边界填充

在OpenCV的图像处理中&#xff0c;边界填充主要用于在图像边缘添加额外的像素。这项技术在多种图像处理任务中都有重要的应用&#xff0c;包括但不限于卷积操作、图像缩放、形态学操作等。 opencv中边界填充的主要方法为copyMakeBorder&#xff0c;其函数原型如下&#xff1a;…

分享一道逻辑题

1、有一个水无限多的是水塘.只有两个水瓶.一个5升一个6升.如何从水塘里用这两个水瓶取出3升水?

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-13

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-13 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-13目录1. The Cognitive Capabilities of Generative AI: A Comparative Analysis with Human Benchmarks2. WALL-E: World Alig…

Postman 如何测试入参是文件类型(File)参数接口

Postman 如何测试 File 类型参数 前提背景测试步骤1、打开 Postman 选择 POST 方法输入调用地址2、参数选择 Body 下的 form-data3、KEY 选择 File 选项&#xff0c;并填写 file 前提背景 springboot 项目&#xff0c;接口的参数是 File 类型&#xff0c;需要通过 Postman 测试…

链表题, 反转链表 , 链表的中间结点 , 删除链表的倒数第 N 个结点 , 移除链表元素

文章目录 206. 反转链表203. 移除链表元素876. 链表的中间结点LCR 021. 删除链表的倒数第 N 个结点 206. 反转链表 题目链接 思路&#xff1a; 将原链表的结点&#xff0c;从头到尾一个个地拿下来头插到一个新链表中&#xff0c;这个新链表起始时为一个空链表。 class Solutio…

同三维T80001HK4 四路4K30HDMI H.264编码器

4路同时编码&#xff0c;带4路3.5外置音频 同三维T80001HK4四路4K30HDMI H.264编码器 同三维T80001HK4用于高清视频信号&#xff08;4K30Hz&#xff09;编码及网络传输的硬件设备&#xff0c;采用最新高效H.264高清数字视频压缩技术&#xff0c;具备稳定可靠、高清晰度、低码率…

408 14——42题

题目&#xff1a; 某网络中的路由器运行OSPF路由协议&#xff0c;题42表是路由器R1维护的主要链路状态信息(LSI)&#xff0c;题42图是根据题42表及R1的接口名构造出来的网络拓扑。 请回答下列问题。 1)本题中的网络可抽象为数据结构中的哪种逻辑结构? 2)针对题42表中的内容&am…

C++ 类和对象-改

在C中&#xff0c;类&#xff08;Class&#xff09;是用户自定义的数据类型&#xff0c;用来封装数据和功能的结合。而对&#xff08;Object&#xff09;是类的实例&#xff0c;通过类的定义可以创建多个对象。C是一种面向对象编程语言&#xff0c;类和对象是其核心概念。 1. …

前端开发基础NodeJS+NPM基本使用(零基础入门)

文章目录 1、Nodejs基础1.1、NodeJs简介1.2、下载安装文件1.3、安装NodeJS1.4、验证安装2、Node.js 创建第一个应用2.1、说明2.2、创建服务脚本2.3、执行运行代码2.4、测试访问3、npm 基本使用3.1、测试安装3.2、配置淘宝npm镜像3.3.1、本地安装3.3.2、全局安装3.4、查看安装信…

项目总思路

一、模型选择 高性能服务器一般用到的是 Reactor 模型&#xff0c;即事件驱动模型。 1、模型一&#xff1a;单 Reactor 单线程模型 只有一个线程会造成性能瓶颈。 适用场景&#xff1a;客户端少&#xff0c;业务处理快速。 2、模型二&#xff1a;单 Reactor 多线程模型 即…

栈——单调栈

题目描述 给定一个长度为 N 的整数数列&#xff0c;输出每个数左边第一个比它小的数&#xff0c;如果不存在则输出 −1。 输入格式 第一行包含整数 N (1≤N≤10^5)&#xff0c;表示数列长度。 第二行包含 N 个整数&#xff0c;表示整数数列。1≤ai≤10^9。 输出格式 共一…

git规范化开发

特性分支开发 以前使用git基本都是随心所欲的用&#xff0c;commit的信息比较随便&#xff0c;所以有时git分支结构有时显得混乱&#xff0c;最近标准化开发的过程中接触了特性分支开发。 何为特性分支&#xff0c;按我的理解&#xff0c;就是每一次代码的修改提交&am…