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

C语言整数溢出的问题

目录

补漏:

问题展现

解析

C++的解决方案


补漏:

昨天我在开头提到-1的二进制如何表示,我在这里简单分析一下。

首先我们要明白有符号的数转换是需要补码的,所以我们想这个问题之前将补码的规则思考一遍(首先将有符号的首位保留,后面几位取反后加一,然后算出数值后加上开头保留的符号就可以了)。现在我们求的是-1的二进制,那么就需要我们反着求解。我们要先想到1的二进制数(0000 0001)。首先我们要想到取反加一,然后符号位是1(代表负号),那么什么样的二进制数满足这样的需求呢?那毫无疑问就是1111 1111了(满足首位是1的条件,也满足其余位取反加1可以表达1的要求)。提升补充内容——补码原文在这。


现在开始我们今天的内容吧。

问题展现

还记得C语言是如何表示整数的吗?在补码那里就已经说过,整数在C++中的表示是特殊的,直接的二进制数是不能正确的表示的。因为整数的二进制首位是符号位,剩下的位数才是这个整数的大小表示;就拿32位做例子。1111 1111这其实就是二进制的-1表示,首位是符号位,其余的位数才是大小的表达。但是这就会牵涉到一问题,那就是超出了二进制的表达范围。

#include<iostream>
using namespace std;
int main()
{
//例1
int i=2147484444
for(;i>0;i++)
{
cout<<"add"<<i<<endl;
}
cout<<"end"<<i<<endl;//例2
int a=600;
int b=700;
int c=100;
int d=600;
cout<<a*b*c*d<<endl;return 0;
} 

上面的代码实例大家可以事先预测一下结果是多少,或者说判断一下结果是否是正数。

揭晓答案:这几个数都不是正数,都是负数。


这是为什么呢?

解析

这正是由于整数的溢出导致的,那么为什么会溢出呢?因为C语言中的内存分配是有限的,这就导致一旦我们输入的数大于数据类型,那么就会导致数据溢出。一旦溢出,就会从该数据类型所能表达的最大值返回到所能表达的最小值(负值)开始,相当于一个循环,从最大到最小。这也就说明在C语言中数学中的数字表达无法完全照搬的。

在C语言中,整数溢出是一个常见的问题,它发生在整数变量的值超出了其能够表示的范围时。C语言中的整数类型(如int、short、long等)都有固定的范围,这些范围由编译器和平台决定,但通常是基于标准的(如ISO C标准)。

整数类型范围示例
对于一个32位的int类型,其范围通常是-2,147,483,648到2,147,483,647(包括边界值)。
对于一个无符号的32位unsigned int,其范围则是0到4,294,967,295。
溢出示例

假设你有一个int变量x,其值为2,147,483,647(INT_MAX),如果你尝试执行x = x + 1;,由于x已经处于其能表示的最大值,因此无法存储更大的值。在这种情况下,x的值会“回绕”到其能表示的最小值(对于int来说,是-2,147,483,648),这就是所谓的整数溢出。

解决方案

  1. 使用更大的整数类型:如果可能,使用long long或unsigned long long等更大的整数类型来存储更大的值。
  2. 检查边界条件:在执行可能导致溢出的操作之前,检查变量的值是否接近其类型的最大值或最小值。
  3. 使用库函数:对于某些操作,如加法、乘法等,可以使用能够处理溢出的库函数(如GNU C Library中的__builtin_add_overflow等)。
  4. 使用软件方法:对于复杂的算法,可能需要设计特定的逻辑来避免或检测整数溢出。
  5. 使用硬件特性:在某些平台上,可以利用硬件特性(如溢出标志)来检测整数溢出。

注意事项
整数溢出是未定义行为(Undefined Behavior, UB),这意味着编译器可以以任何方式处理它,包括不产生任何错误消息。
在进行安全敏感或关键任务的应用程序中,必须特别注意整数溢出的问题。


C++的解决方案

很遗憾这个问题C语言是无法完全解决的。这里将一个库(boost),利用这个库来解决。这个库利用的是字符串(无限长)来表达无限长的数。

boost库

这个链接里就是boost库的网站,里面有想要的一切关于boost的用法和实例。

下面简单讲解一下使用方法。

首先打开我放置的链接,然后找到documentation点击进去,然后搜素Multiprecision,然后点击里面的cpp_int,进去就可以看到使用方法和简单实例。

#include <boost/multiprecision/cpp_int.hpp>
#include <iostream>int main()
{using namespace boost::multiprecision;int128_t v = 1;// Do some fixed precision arithmetic:for(unsigned i = 1; i <= 20; ++i)v *= i;std::cout << v << std::endl; // prints 2432902008176640000 (i.e. 20!)// Repeat at arbitrary precision:cpp_int u = 1;for(unsigned i = 1; i <= 100; ++i)u *= i;// prints 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000 (i.e. 100!)std::cout << u << std::endl;return 0;
}

 上面的代码就是实例,可以模仿着去写,但是我还是建议去看看原版的文章,了解一下。


小问题思考一下:首先我请你思考一下八位的二进制最大可以表达多大的数,那么最小呢?其实最大是127,最小是-128。那么请你思考一下为什么最小值和最大值在数值上不相等呢?还有它们之间是如何转换的?答案下期揭晓

🆗到这里,这篇关于C语言整数溢出的问题的陷阱就说完了,求一个免费的赞,感谢阅读。

下期预告:C语言字符串缺陷

相关文章:

C语言整数溢出的问题

目录 补漏&#xff1a; 问题展现 解析 C的解决方案 补漏&#xff1a; 昨天我在开头提到-1的二进制如何表示&#xff0c;我在这里简单分析一下。 首先我们要明白有符号的数转换是需要补码的&#xff0c;所以我们想这个问题之前将补码的规则思考一遍&#xff08;首先将有符号…...

Linux学习之路 -- 进程 -- 进程间通信 -- 管道通信

本文主要介绍进程通信中的管道通信。 前面我们学习进程的过程中&#xff0c;我们知道&#xff0c;进程是具有独立性的。这也就导致了进程不能够直接地把数据进行传递。为了实现进程之间地通信&#xff0c;我们就需要通过另外地方式来实现进程之间数据地传递。 1.进程通信的目…...

GB/T 38082-2019 生物降解塑料购物袋检测

生物降解塑料购物袋是指以生物降解树脂为主要原料制得的&#xff0c;具有提携结构的&#xff0c;在销售、服务等场所用于盛装及携提商品的袋制品。 GB/T 38082-2019 生物降解塑料购物袋检测项目&#xff1a; 检测项目 测试标准 尺寸偏差 GB/T 38082 感官 GB/T 38082 提掉…...

docker数据卷和资源控制

目录 数据卷 实现数据卷 宿主机和容器之间进行数据共享 容器与容器之间进行数据共享 容器互联 docker容器的资源控制 cpu 1.设置cpu资源控制&#xff08;比重&#xff09; 2. 设置cpu的资源占用比&#xff08;权重&#xff09; 3.设置容器绑定cpu 内存 1.内存限制 …...

Kafka系统及其角色

Apache Kafka系统介绍 Apache Kafka 是由 LinkedIn 公司最初开发的一个高性能、分布式的消息传递系统。它被设计为一个可扩展、持久、分布式的流式处理平台&#xff0c;以满足 LinkedIn 在实时数据处理方面的需求 。Kafka 的诞生源于 LinkedIn 需要处理海量数据时现有消息队列系…...

从零开始构建霸王餐返利APP的技术路线与挑战

从零开始构建霸王餐返利APP的技术路线与挑战 大家好&#xff0c;我是阿可&#xff0c;微赚淘客系统及省赚客APP创始人&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在电商领域&#xff0c;霸王餐返利APP作为一种新兴的商业模式&#xff0c;为用…...

安装Jmeter,配置jdk

注意点: java的jdk和jmeter的版本相匹配 ! ! ! 目前我使用的是1.8的的,jmeter使用的是5.6.3 JDK下载地址&#xff1a;https://www.oracle.com/cn/java/technologies/downloads 别管,直接傻瓜式安装点点就完了... 1.电脑-属性-高级系统设置-环境变量 2.系统变量-新建-变量…...

Aria2@RPC下载@Alist批量下载

文章目录 abstractAria2 RPC 概述RPC 的主要功能在线文档aria2的配置文件与启动选项使用配置文件设置aria2 rpc功能Aria2关于rpc的离线文档 Aria2 RPC 重要和常用选项1. enable-rpc2. rpc-listen-port3. rpc-secret4. rpc-listen-all5. rpc-allow-origin-all6. rpc-max-request…...

神经串联式语音转换:对基于串联的单次语音转换方法的再思考 论文笔记

NEURAL CONCATENATIVE SINGING VOICE CONVERSION: RETHINKING CONCATENATION-BASED APPROACH FOR ONE-SHOT SINGING VOICE CONVERSION 笔记 发现问题&#xff1a; 在any-to-any的转换中,由于内容和说话人音色的解耦不足,导致源说话人的音色部分仍保留在转换后的音频中&#x…...

机器学习(1)--数据可视化

文章目录 数据可视化作用可视化方法实现可视化 总结 数据可视化 数据可视化是将数据以图形、图像、动画等视觉形式表示出来&#xff0c;以便人们能够更直观地理解、分析和交流数据中的信息。 作用 一个整理的好好的数据&#xff0c;我们为什么要将其可视化呢&#xff1f;将它…...

docker部署Prometheus、Grafana

docker部署Prometheus 1、 拉取prometheus镜像 docler pull prom/prometheus 遇到问题&#xff1a;注意下科学上网。 2、将prometheus配置文件放在外面管理 prometheus.yml global:scrape_interval: 15sevaluation_interval: 15salerting:alertmanagers:- static_configs:-…...

5.mysql多表查询

MYSQL多表查询 MYSQL多表查询1.多表关系笛卡尔积 2. 多表查询概述2.1 内连接2.2 外连接2.3自连接联合查询union &#xff0c;union all 2.4子查询2.4.1标量子查询2.4.2列子查询2.4.3行子查询2.4.4表子查询 MYSQL多表查询 create table student(id int auto_increment primary …...

【前端面试】挖掘做过的nextJS项目(上)

为什么使用nextJS 需求: 快速搭建宣传官网 1.适应pc、移动端 2.基本的路由跳转 3.页面渲染优化 4.宣传的图片、视频资源的加载优化 5.seo优化 全栈react web应用、 tailwind css原子工具的支持&#xff0c;方便书写响应式ui app router(React 服务器组件)支持服务器渲…...

【Unity-UGUI】UGUI知识汇总

目录 前言1 UGUI系统原理2 事件系统2.1 EventSystem2.2 InputModules2.3 Raycasters2.4 协作 3 UGUI系统的组件3.1 Image和RawImage3.2 Mask和RectMask2D 扩展UI穿透问题 前言 记录一些最近学到的有关UGUI的知识。 参考 知乎&#xff1a;6千字带你入门UGUI源码 书籍&#xff…...

JavaScript性能测试:策略、工具与实践

在Web开发中&#xff0c;性能测试是确保应用程序达到预期响应速度和处理能力的关键步骤。JavaScript作为构建交互式Web应用的核心语言&#xff0c;其性能直接影响用户体验。本文将详细介绍如何使用JavaScript进行性能测试&#xff0c;包括性能测试的基本概念、测试类型、工具、…...

嵌入式软件开发学习一:软件安装(保姆级教程)

资源下载&#xff1a; 江协科技提供&#xff1a; 资料下载 一、安装Keil5 MDK 1、双击.EXE文件&#xff0c;开始安装 2、 3、 4、此处尽量不要安装在C盘&#xff0c;安装路径选择纯英文&#xff0c;防止后续开发报错 5、 6、 7、弹出来的窗口全部关闭&#xff0c;进入下一步&a…...

SpringMVC学习中遇到的不懂注解记录

文章目录 Autowrite 和 ResourceQualifier 和 PrimaryPathVariableController、Service、Repository 和 Component Autowrite 和 Resource 我们先讲讲 Autowrite 注解 吧。 public class StudentService3 implements IStudentService {//Autowiredprivate IStudentDao studentD…...

Java面试题--分布式锁

分布式锁 你说一下什么是分布式锁 分布式锁是在分布式/集群环境中解决多线程并发造成的一系列数据安全问题.所用到的锁就是分布式锁&#xff0c;这种锁需要被多个应用共享才可以&#xff0c;通常使用Redis和zookeeper来实现。 分布式锁有哪些解决方案 常用的三种方案 基于…...

一文讲清数据平台与数据中台的关系与区别

前言 如果您是IT领域或者数据领域的从业者&#xff0c;一定对IT行业“创造”概念的能力深有体会&#xff0c;也一定经常被看起来名称相似&#xff0c;但又不同的各种概念绕的云里雾里&#xff0c;摸不着头脑。今天我们要讨论的是数据平台和数据中台两个概念&#xff0c;您是不…...

Android的Service和Thread的区别

Service 是一种可在后台执行长时间运行操作而不提供界面的应用组件。 Android Service是组件&#xff0c;既不能说它是单独的进程也不能说它是单独的线程。 如果非要从通俗的语言层面来理解的话&#xff0c;姑且将其理解为对象。这个Service对象本身作为应用程序的一部分与它的…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...