当前位置: 首页 > news >正文

【C++】 算术操作符与数据类型溢出详解


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯C++ 算术操作符详解
    • 基本算术操作符
    • 整数除法与取模行为
    • 类型转换在算术运算中的作用
    • 自增与自减操作符
  • 💯数值溢出:当值超出类型范围时
    • 数据类型的取值范围
    • 正向与负向溢出
    • 避免数值溢出的方法
  • 💯`char` 类型与 ASCII 表的关系
    • `char` 的本质
    • 如何输出整数值和字符值
    • 示例:`char` 赋值整数与字符
      • `char a = 127` 是否规范?
  • 💯取模操作与负数的处理
    • 取模运算符 `%`
      • 工作机制
      • 规则总结
      • 示例
    • 如何确保结果为正?
  • 💯编程建议
  • 💯小结


在这里插入图片描述


💯前言

  • 在程序设计中,理解算术操作符的机制以及数据类型的行为是至关重要的,尤其是在涉及不同类型的数据运算时。本文深入探讨了 C++ 中的算术操作符、数值溢出和类型转换 的细节,结合实际编程中的典型疑问,为您提供理论与实践相结合的视角。本文将涵盖基本算术操作、类型转换、负数取模、数值溢出,以及字符类型(char)与 ASCII 编码的细节。
    C++ 参考手册
    在这里插入图片描述

💯C++ 算术操作符详解

在这里插入图片描述


基本算术操作符

C++ 提供了一组基本的算术操作符,用于执行常见的数学运算,主要包括:

  • +加法,用于将两个操作数相加。
  • -减法,用于计算两个操作数的差值。
  • *乘法,用于计算两个操作数的积。
  • /除法,用于将第一个操作数除以第二个操作数。
  • %取模,用于计算两个整数的余数。

在这里插入图片描述


整数除法与取模行为

  • 整数除法 (/):当两个操作数都是整数类型时,结果也是整数,小数部分将被舍弃。例如:

    int b = 2;
    double d = 7 / 2;  // 结果是 3,因为小数部分被舍弃
    

    在这里插入图片描述

    在上述代码中,虽然变量 d 被定义为 double 类型,但 72 均为 int 类型,因此 7 / 2 的结果为整数 3,随后赋值给 d,因此 d 的值为 3.0

    对于正确处理浮点结果,至少需要确保一个操作数为浮点类型。例如:

    double d = 7.0 / 2;  // 结果为 3.5,因为 7.0 是 double 类型
    

在这里插入图片描述

  • 取模操作 (%) 只能用于整数类型。
    在这里插入图片描述

  • 如果操作数是浮点数类型,必须使用 <cmath> 库中的 fmod 函数来计算余数。例如:

    #include <cmath>
    double result = fmod(10.5, 3.2);  // 结果是 0.9
    

    在这里插入图片描述


类型转换在算术运算中的作用

在算术运算中,C++ 通常会对不同类型的操作数进行隐式类型转换,以确保运算的精度和一致性。例如:

  • intdouble 进行运算时,int 会被自动提升为 double,然后进行浮点运算。
    double d = 6.0 / 4;  // 结果是 1.5,因为 6.0 是 double,4 被提升为 double
    
    在上述代码中,6.0double 类型,而 4int,C++ 会将 4 隐式提升为 4.0,进而进行浮点除法,最终得到 1.5
    在这里插入图片描述

自增与自减操作符

C++ 中的 ++-- 操作符用于对变量进行自增和自减操作:

  • 前置形式 (++a--a):先对变量的值进行改变,再使用改变后的值。
  • 后置形式 (a++a--):先使用变量的原始值,再对其进行改变。

例如:

int a = 5;
int b = ++a;  // b = 6, a = 6
int c = a++;  // c = 6, a = 7

在这里插入图片描述

在复杂的表达式或循环中,前置与后置自增/自减操作符的使用对结果有很大的影响,因此应当谨慎使用。

在这里插入图片描述


💯数值溢出:当值超出类型范围时

在 C++ 中,数值溢出指的是当计算结果超出变量数据类型所能表示的范围时,结果可能变得无法预测或与预期不符。数值溢出在处理较小的数据类型(如 charshort)时尤为常见。

在这里插入图片描述


数据类型的取值范围

每种数据类型在 C++ 中都有相应的取值范围,这与它们的存储大小直接相关。例如:

  • char 类型:通常占用 1 个字节,有符号的 char 范围为 -128127
  • int 类型:通常占用 4 个字节,范围为 -2,147,483,6482,147,483,647(具体范围取决于编译器和平台)。

当计算结果超出这些取值范围时,便会发生溢出。例如:

#include <iostream>
using namespace std;
int main()
{char a = 127;  char b = a + 1;  cout << (int)b << endl;  //-128return 0;
}

在上述代码中,a 的初始值为 char 类型的最大值 127,再加 1 会导致溢出,最终结果从 -128 开始循环。
在这里插入图片描述


正向与负向溢出

  • 正向溢出:当一个有符号类型的值达到最大值再加一时,结果会从最小值重新开始。例如,char a = 127; a += 1; 的结果是 -128
  • 负向溢出:当一个有符号类型的值达到最小值再减一时,结果会从最大值重新开始。例如,char a = -128; a -= 1; 的结果是 127
    在这里插入图片描述

这些现象遵循二进制补码的规则,溢出的结果会在数值范围内循环,这在某些算法中可能导致严重的逻辑错误,特别是在数值计算和边界条件处理时。


避免数值溢出的方法

  • 使用更大的数据类型:如果运算结果可能超出当前类型的范围,应使用更大范围的数据类型,如 longlong long
  • 手动检查溢出风险:在执行运算前,可以对操作数进行判断,以确保不会发生溢出。
  • 使用专门的库或工具:一些库(如 SafeInt)或编译器选项能够检测并避免溢出,从而保障程序的正确性。

在这里插入图片描述


💯char 类型与 ASCII 表的关系

在这里插入图片描述


char 的本质

在 C++ 中,char 类型实际上是一个整数类型,用于存储字符的 ASCII 编码值。char 通常占用 1 个字节,可以表示 -128127(有符号)或 0255(无符号)的整数。

当给 char 赋值一个整数时,实际上是将该整数视为 ASCII 码。例如:

char c = 65;
std::cout << c << std::endl;  // 输出:A

在上述代码中,65 是 ASCII 表中字符 A 的编码,因此输出为 A
在这里插入图片描述


如何输出整数值和字符值

  • 作为字符输出:直接输出 char 类型时,会显示其对应的 ASCII 字符。
  • 作为整数输出:如果希望查看 char 实际存储的整数值,可以将其强制类型转换int
    char c = 'A';
    std::cout << (int)c << std::endl;  // 输出:65
    

在这里插入图片描述


示例:char 赋值整数与字符

考虑以下代码:

char a = 127;
a += 1;
std::cout << (int)a << std::endl;  // 输出:-128

在上述代码中,a 被赋值为整数 127,表示 char 的最大正值。当 a += 1 时,发生溢出,结果为 -128。这是因为 char 类型按照二进制补码表示数值,从最大值溢出到最小值。

在这里插入图片描述


char a = 127 是否规范?

char a = 127; 中,127 是一个整数值,不需要加引号。char 类型存储的是整数值,这个值会在输出时按照 ASCII 编码对应的字符显示。例如,char a = 65; 会输出字符 A。在上述例子中,127char 类型的最大值,当 a += 1 后发生溢出,结果是 -128。因此,直接给 char 赋整数值是合法的,不需要加引号。

在这里插入图片描述


💯取模操作与负数的处理

在这里插入图片描述


取模运算符 %

在 C++ 中,取模运算符 % 用于计算两个整数相除后的余数。然而,当操作数中存在负数时,其行为可能并不符合直觉。
在这里插入图片描述


工作机制

取模运算基于整数除法,通过计算商并求得余数。

  • 具体公式为:a % b = a - (a / b) * b
  • 当有负数时,a / b 的商向零取整,余数的符号由被除数决定。
  • 例如,-7 % 3 中,-7 / 3 的商为 -2(向零取整),余数的计算为:-7 - (-2 * 3) = -7 + 6 = -1
    在这里插入图片描述

规则总结

  • 结果的符号由被除数(左操作数)决定
    • 例如:-7 % 3 的结果是 -1,因为 -7 是负数,结果的符号也为负。
    • 类似地,7 % -3 的结果是 1,因为 7 是正数。
      在这里插入图片描述

示例

int a = -7;
int b = 3;
std::cout << a % b << std::endl;  // 输出:-1

在上述代码中,-7 / 3 的商为 -2(向零取整),余数为 -1。在取模运算中,符号遵循被除数的符号。
在这里插入图片描述


如何确保结果为正?

在某些情况下,我们可能希望取模结果始终为正数,可以使用以下公式来实现:

int result = ((a % b) + b) % b;

这个公式可以确保无论 ab 的符号如何,结果始终为非负值。
在这里插入图片描述


💯编程建议

  • 注意类型范围:在进行加法、乘法等操作时,确保结果不会超出当前数据类型的范围,以避免不必要的溢出。
  • 选择合适的数据类型:根据预期的数据规模选择适合的数据类型(例如 long long 而非 int),以确保结果的正确性。
  • 明确取模运算的行为:特别是在涉及负数时,应仔细理解取模运算的符号规则,必要时通过调整公式来获得预期的结果。
    在这里插入图片描述

💯小结

  1. 在这里插入图片描述
    算术操作符和类型转换:整数运算结果是整数,小数部分会被舍弃,而浮点运算可以保留精度。
  2. 数值溢出:当操作数超出其类型范围时,会发生溢出,结果会按二进制补码规则循环。
  3. char 类型与整数赋值char 本质上是一个整数类型,赋值整数时会存储其对应的 ASCII 码值。
  4. 负数取模:取模结果的符号由被除数决定,负数取模时可能需要调整公式以确保结果为正。

在这里插入图片描述


在这里插入图片描述


相关文章:

【C++】 算术操作符与数据类型溢出详解

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;C 算术操作符详解基本算术操作符整数除法与取模行为类型转换在算术运算中的作用自增与自减操作符 &#x1f4af;数值溢出&#xff1a;当值超出类型范围时数据类型的取值范围…...

柔性芯片:实现万物互联的催化剂

物联网 (IoT) 市场已经非常成熟&#xff0c;麦肯锡预测&#xff0c;物联网将再创高峰&#xff0c;到 2030 年将达到 12.5 万亿美元的估值。然而&#xff0c;万物互联 (IoE) 的愿景尚未实现&#xff0c;即由数十亿台智能互联设备组成&#xff0c;提供大规模洞察和效率。 究竟是…...

FFmpeg 简介与编译

1. ffmpeg 简介&#xff1a; FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec&#xff0c;为了保证高可移…...

低代码与微服务融合在医疗集团中的补充应用探究

摘要 本论文深入探讨了低代码与微服务融合在医疗系统集群中的应用。分析了其优势&#xff0c;包括提高开发效率、降低技术门槛、灵活适应需求变化和易于维护扩展等&#xff1b;阐述了面临的挑战&#xff0c;如数据安全与隐私保护、技术应用复杂性等&#xff1b;并展望了其在医…...

速盾:高防cdn的搜索引擎回源是什么?

高防CDN&#xff08;Content Delivery Network&#xff09;是一种用于加速网站访问速度和增加安全性的服务&#xff0c;它通过将静态和动态内容缓存在全球分布的服务器上&#xff0c;从而将用户请求的响应时间降至最低&#xff0c;并提供有效的防御攻击的能力。在实际使用过程中…...

减少电路和配电系统谐波的五种方法

K 级变压器 ANSI 标准 C57.110-1986 定义了 K 系数来评估电路消耗多少谐波电流并确定该谐波电流的热效应。根据电路 K 系数&#xff0c;变压器按 K 等级制造。值得注意的是&#xff0c;K 级变压器不会减少谐波。K 等级表示变压器承受谐波有害影响的相对能力。K级变压器增加了铁…...

基于Java Springboot Vue3图书管理系统

一、作品包含 源码数据库设计文档万字全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue3、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA 数据库&#x…...

vue-cli项目质量约束配置

同步发布于我的网站 &#x1f680; package.json scriptslint-stageddevDependencies git-hooksno-eslintdevDependencies - scssdevDependencies - lessengines pre-commit.eslintrc.js.stylelintrc scssless vue.config.jsREADME.md package.json scripts "scripts&…...

第七课 Unity编辑器创建的资源优化_UI篇(UGUI)

上期我们学习了简单的Scene优化&#xff0c;接下来我们继续编辑器创建资源的UGUI优化 UI篇&#xff08;UGUI&#xff09; 优化UGUI应从哪些方面入手&#xff1f; 可以从CPU和GPU两方面考虑&#xff0c;CPU方面&#xff0c;避免触发或减少Canvas的Rebuild和Rebatch&#xff0c…...

【docker】docker build上下文

什么是 Docker Build 上下文&#xff1f; 在 Docker 中&#xff0c;构建上下文&#xff08;Build Context&#xff09; 是指在执行 docker build 命令时&#xff0c;Docker 会发送给 Docker 引擎的所有文件和目录的集合。构建上下文包含了 Dockerfile 和用于构建镜像的所有文件…...

ESLint 配置文件全解析:格式、层叠与扩展(3)

配置文件系统处于一个更新期&#xff0c;存在两套配置文件系统&#xff0c;旧的配置文件系统适用于 v9.0.0 之前的版本&#xff0c;而新的配置文件系统适用于 v9.0.0之后的版本&#xff0c;但是目前还处于 v8.x.x 的大版本。 配置文件格式 在 ESLint 中&#xff0c;支持如下格…...

org.apache.commons.lang3包下的StringUtils工具类的使用

前言 相信平时在写项目的时候&#xff0c;一定使用到StringUtils.isEmpty()&#xff1b;StringUtils.isBlank();但是你真的了解他们吗&#xff1f; 也许你两个都不知道&#xff0c;也许你除了isEmpty/isNotEmpty/isNotBlank/isBlank外&#xff0c;并不知道还有isAnyEmpty/isNon…...

HarmonyOS4+NEXT星河版入门与项目实战(23)------组件转场动画

文章目录 1、控件图解2、案例实现1、代码实现2、代码解释3、实现效果4、总结1、控件图解 这里我们用一张完整的图来汇整 组件转场动画的用法格式、属性和事件,如下所示: 2、案例实现 这里我们对上一节小鱼游戏进行改造,让小鱼在游戏开始的时候增加一个转场动画,让小鱼自…...

十一、快速入门go语言之接口和反射

文章目录 接口:one: 接口基础:two: 接口类型断言和空接口:star2: 空接口实现存储不同数据类型的切片/数组:star2: 复制切片到空接口切片:star2: 类型断言 反射 &#x1f4c5; 2024年5月9日 &#x1f4e6; 使用版本为1.21.5 接口 十、Java类的封装和继承、多态 - 七点半的菜市…...

智能化图书馆导航系统方案之系统架构与核心功能设计

hello~这里是维小帮&#xff0c;点击文章最下方获取图书馆导航系统解决方案&#xff01;如有项目需求和技术交流欢迎大家私聊我们~撒花&#xff01; 针对传统图书馆在图书查找困难、座位紧张、空间导航不便方面的问题&#xff0c;本文深入剖析了基于高精度定位、3D建模、图书搜…...

学习嵩山版《Java 开发手册》:编程规约 - 命名风格(P13 ~ P14)

概述 《Java 开发手册》是阿里巴巴集团技术团队的集体智慧结晶和经验总结&#xff0c;他旨在提升开发效率和代码质量 《Java 开发手册》是一本极具价值的 Java 开发规范指南&#xff0c;对于提升开发者的综合素质和代码质量具有重要意义 学习《Java 开发手册》是一个提升 Jav…...

Qt关于padding设置不起作用的的解决办法

观察以下的代码&#xff1a; MyWidget::MyWidget(QWidget *parent): QWidget{parent},m_btn(new QToolButton(this)) {this->setFixedSize(500,500);m_btn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);m_btn->setIcon(QIcon("F:tabIcon/person-white.s…...

Golang教程第10篇(语言循环语句-语言循环嵌套)

Go 语言循环嵌套 Go 语言循环语句Go 语言循环语句 Go 语言允许用户在循环内使用循环。接下来我们将为大家介绍嵌套循环的使用。 语法 以下为 Go 语言嵌套循环的格式&#xff1a; for [condition | ( init; condition; increment ) | Range] {for [condition | ( init; con…...

Python Web 开发:FastAPI 入门实战 —— HTTP 基础与 RESTful API 设计

Python Web 开发&#xff1a;FastAPI 入门实战 —— HTTP 基础与 RESTful API 设计 目录 &#x1f680; HTTP 协议概述&#x1f310; HTTP 请求与响应的工作原理&#x1f6e0;️ RESTful API 设计理念&#x1f5c2;️ JSON 格式数据的传输与解析 1. &#x1f680; HTTP 协议概…...

uniapp实现组件竖版菜单

社区图片页面 scroll-view scroll-view | uni-app官网 (dcloud.net.cn) 可滚动视图区域。用于区域滚动。 需注意在webview渲染的页面中&#xff0c;区域滚动的性能不及页面滚动。 <template><view class"pics"><scroll-view class"left"…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 原创笔记&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 上一篇&#xff1a;《数据结构第4章 数组和广义表》…...

麒麟系统使用-进行.NET开发

文章目录 前言一、搭建dotnet环境1.获取相关资源2.配置dotnet 二、使用dotnet三、其他说明总结 前言 麒麟系统的内核是基于linux的&#xff0c;如果需要进行.NET开发&#xff0c;则需要安装特定的应用。由于NET Framework 是仅适用于 Windows 版本的 .NET&#xff0c;所以要进…...

大模型——基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程

基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程 下载安装Docker Docker官网:https://www.docker.com/ 自定义Docker安装路径 Docker默认安装在C盘,大小大概2.9G,做这行最忌讳的就是安装软件全装C盘,所以我调整了下安装路径。 新建安装目录:E:\MyS…...

李沐--动手学深度学习--GRU

1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...

react更新页面数据,操作页面,双向数据绑定

// 路由不是组件的直接跳转use client&#xff0c;useEffect&#xff0c;useRouter&#xff0c;需3个结合&#xff0c; use client表示客户端 use client; import { Button,Card, Space,Tag,Table,message,Input } from antd; import { useEffect,useState } from react; impor…...