c语言数据类型定义错误导致的数据溢出或者死循环

数据溢出问题

#include <stdio.h>/*
数据溢出
*/int main()
{char i;    // 数据表示范围[-128,127]   0xf0 ~ 0x7ffor(i=0;i<130;i++)   //  {printf("%d ",i);}return 0;
}/*
编译运行上面的程序,你会发现程序陷入了死循环,一直在不断打印。当我们给一个变量赋一个超出其能表示范围的数时,就会发生
数据溢出,如上面的示例代码所示,导致程序运行出现异常。对于有符号数,当发生数据溢出时,由于C语言的语法宽松性,不对数据类型做安全性检查,因此也不会触发异常,但是会产生一个
未定义行为。什么是未定义行为呢?通俗点理解,就是遇到这种情况时,C语言标准也没有规定该如何操作,各家编译器在处理这种情况时也就没有了参考标准,各自按照自己的方式处理,编译器都不算错误。这也导致了当有符号数发生溢出时,运行结果是不确定的,在不同的编译器环境下编译运行,结果可能不一样。
*/
#include <stdio.h>/*
数据溢出(无符号)
*/int main()
{unsigned char a=255;  // unsigned char的数据表示范围为[0,255]printf("%u\n",a);a++;printf("%u\n",a);return 0;
}

一般来讲,无符号数溢出时会进行取模运算,继续“周期轮回”

例如,一个unsigned char类型的数据,它能表示的数据范围为[0,255],当其循环到255最大值时继续加1,这个数就变成了0,开始新的一轮循环,周而复始。

#include <stdio.h>/*
数据溢出
*/int main()
{signed char a=127;  // unsigned char的数据表示范围为[0,255]printf("%d\n",a);a++;printf("%d\n",a);return 0;
}
/*
大家可以尝试在不同的编译器环境下编译运行上面的程序,你会发现大部分结果都是-128,也就是说大部分编译器都默认采用了与无符号数一样的轮回处理
*/
int main()
{unsigned char a=0;  // a的取值[0,255]printf("a=%d\n",a);a--;  // 周期轮回,a变成255printf("a=%d\n",a);return 0;
}

在这里插入图片描述

int print_star( unsigned int len)
{int i=1;while(len-- >=0){if(i++%20==0)printf("\n");printf("*");}printf("\n");return 0;
}

以上程序的设计存在问题,如果我们在调用该函数时给它传递一个实参-1,你会发现该程序将陷入死循环。这是因为 l e n len len是unsigned int类型,unsigned int类型在递减的时候存在数据溢出的问题,当减到-1时数据发生溢出, l e n len len的值变成 2 32 − 1 {2}^{32}-1 2321,所以在 l e n len len递减的情况下, l e n ≥ 0 len\ge0 len0

为了防止这种问题发生,我们有两种解决方法:可以将函数的参数类型设置为signed int,或者在print_star()函数中对传进来的实
参进行判断(如代码中注销的示例代码),预防由于隐式类型自动转换而使代码的程序逻辑发生不确定的变化。

如何防范数据溢出?

对于有符号数的相加,方法其实很简单,我们先看看两个有符号数相加的情况。如果两个正数相加的和小于0,说明运算过程中发生了数据溢出。同理,如果两个负数相加的和大于0,也说明数据发生了溢出。

#include <stdio.h>/*
数据溢出
*/int main()
{char a =127;char b=30;char c=a+b;if(c<0){printf("data overflow!!\n");}else{printf("%d\n",c);}return 0;
}

在这里插入图片描述
对于无符号数的相加,如果两个数的和小于其中任何一个加数,此时我们也可以判断数据在计算过程中发生了溢出现象。

#include <stdio.h>/*
数据溢出
*/int main()
{unsigned char a =255;unsigned char b=30;unsigned char c=a+b;if(c<a  || c<b){printf("data overflow!!\n");}else{printf("%d\n",c);}return 0;
}

在这里插入图片描述

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

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

相关文章

m1芯片xcode15编译cocos2dx一些报错处理

报错1: No matching function for call to ‘iconv’ No matching function for call to ‘iconv_close’ 解决&#xff1a; 强转&#xff1a; iconv_close((iconv_t)_iconv); iconv((iconv_t)_iconv, (char**)&pin, &inLen, &pout, &outLen); 报错2: Proper…

【Java万花筒】加速Java应用程序:探索性能优化的利器

Java性能优化&#xff1a;提升应用程序效率与可靠性的关键 前言 在当今软件开发领域中&#xff0c;性能是一个至关重要的方面。对于Java应用程序而言&#xff0c;优化其性能可以带来更高的效率和更好的用户体验。本文将介绍一些常用的Java性能优化库和工具&#xff0c;帮助开…

第5个-模糊加载

Day 5 - Blurry Loading 1. 项目展示 2. 分析思路 变化过程 数字从 0 不断增长到 100&#xff1b;中间的百分比数字逐渐消失&#xff0c;即透明度 opacity 从 1 到 0&#xff1b;背景图片从模糊变为清晰&#xff0c;滤镜 filter.blur()的参数设置为从 30px 到 0px。 小 tips…

unity学习案例总结

动态标签 GitHub - SarahMit/DynamicLabel3D: Simple dynamic labels for a 3D Unity scene

《CSS 简易速速上手小册》第6章:高级 CSS 技巧(2024 最新版)

文章目录 6.1 使用 CSS 变量进行设计&#xff1a;魔法配方的调配6.1.1 基础知识6.1.2 重点案例&#xff1a;创建可定制的主题6.1.3 拓展案例 1&#xff1a;响应式字体大小6.1.4 拓展案例 2&#xff1a;使用 CSS 变量创建动态阴影效果 6.2 calc(), min(), max() 等函数的应用&am…

Flutter typedef 函数类型

typedef 函数 在flutter中的应用&#xff1a; 实际上在使用 flutter 的时候经常会用到这个东西&#xff1a;比如 IconButton 组件里面 onPressed IconButton(onPressed: () {},icon: Icon(Icons.add), ), 到 onPressed 定义的地方: VoidCallback /// The callback that is ca…

解释Java中的并发集合类,比如ConcurrentHashMap和CopyOnWriteArrayList

解释Java中的并发集合类&#xff0c;比如ConcurrentHashMap和CopyOnWriteArrayList 在Java中&#xff0c;有许多用于并发编程的集合类&#xff0c;它们提供了线程安全的操作&#xff0c;可以在多线程环境中安全地访问和修改数据。两个常见的并发集合类是 ConcurrentHashMap 和…

【CTFshow】VIP题目限免 通关

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

我主编的电子技术实验手册(03)——电阻的识别与测量

本专栏是笔者主编教材&#xff08;图0所示&#xff09;的电子版&#xff0c;依托简易的元器件和仪表安排了30多个实验&#xff0c;主要面向经费不太充足的中高职院校。每个实验都安排了必不可少的【预习知识】&#xff0c;精心设计的【实验步骤】&#xff0c;全面丰富的【思考习…

AI大模型学习笔记之四:生成式人工智能(AIGC)是如何工作的?

OpenAI 发布 ChatGPT 已经1年多了&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;也已经广为人知&#xff0c;我们常常津津乐道于 ChatGPT 和 Claude 这样的人工智能系统能够神奇地生成文本与我们对话&#xff0c;并且能够记忆上下文情境。 Midjunery和DALLE 这样的AI…

随机过程及应用学习笔记(一)概率论(概要)

概率是随机的基础&#xff0c;在【概率论&#xff08;概要&#xff09;】这个部分中仅记录学习随机过程及应用的基本定义和结果。 前言 首先&#xff0c;概率论研究的基础是概率空间。概率空间由一个样本空间和一个概率测度组成&#xff0c;样本空间包含了所有可能的结果&…

90.Go语言中实现可选参数的几种方法:可变长参数、使用Map、结构体和函数选项模式

文章目录 导言方法1&#xff1a;可变长参数&#xff08;Variadic Args&#xff09;方法2&#xff1a;使用Map方法3&#xff1a;使用结构体&#xff08;Structs&#xff09;方法4&#xff1a;函数选项模式&#xff08;Functional Options Pattern&#xff09;五、总结 导言 我们…

服务器解析漏洞及任意文件下载

1.服务器文件解析漏洞 文件解析漏洞,是指Web容器&#xff08;Apache、nginx、iis等&#xff09;在解析文件时出现了漏洞,以其他格式执行出脚本格式的效果。从而,黑客可以利用该漏洞实现非法文件的解析。 &#xff08;1) Apache linux系统中的apache的php配置文件在/etc/apac…

【数据结构】顺序栈和链式栈的简单实现和解析(C语言版)

数据结构——栈的简单解析和实现 一、概念二、入栈&#xff08;push&#xff09;三、出栈&#xff08;pop&#xff09;四、顺序栈简单实现 &#xff08;1&#xff09;进栈操作&#xff08;2&#xff09;出栈操作 一、概念 本篇所讲解的栈和队列属于逻辑结构上的划分。逻辑结构…

综合项目---博客

一.运行环境 192.168.32.132 Server-Web linux Web 192.168.32.133 Server-NFS-DNS linux NFS/DNS 基础配置 1.配置主机名静态ip 2.开启防火墙并配置 3.部分开启selinux并配置 4.服务器之间通过阿里云进行时间同步 5.服务器之间实现ssh免密…

SpringCloud-Ribbon:负载均衡(基于客户端)

6. Ribbon&#xff1a;负载均衡(基于客户端) 6.1 负载均衡以及Ribbon Ribbon是什么&#xff1f; Spring Cloud Ribbon 是基于Netflix Ribbon 实现的一套客户端负载均衡的工具。简单的说&#xff0c;Ribbon 是 Netflix 发布的开源项目&#xff0c;主要功能是提供客户端的软件负…

Flask基础学习2

连接mysql数据库测试(专业版) [注意1&#xff1a;要导入text库&#xff0c;否则可能出现找不到select 1错误] [注意2&#xff1a;若出现下列问题&#xff0c;可按照模板代码的顺序db SQLAlchemy(app) 的位置] RuntimeError: Either SQLALCHEMY_DATABASE_URI or SQLALCHEMY_B…

MMKV:轻巧高效的跨平台键值存储解决方案

MMKV&#xff1a;轻巧高效的跨平台键值存储解决方案 引言 在移动应用的开发中&#xff0c;数据存储是一个至关重要的环节。随着移动应用的普及和功能的增多&#xff0c;应用需要存储和管理各种类型的数据&#xff0c;包括用户配置信息、缓存数据、临时状态等。传统的数据存储…

acwing14期周赛---------安排时间(贪心+枚举)

贝茜独立经营着一家餐厅&#xff0c;她一天的营业时间可以分为 n 个时段&#xff0c;编号 1∼n。 在这一天的营业中&#xff0c;她一共接收到了 m 个客人的预约用餐订单&#xff0c;编号 1∼m。 其中&#xff0c;第 i 个订单的相关信息如下&#xff1a; 贝茜在第 si个时段接到该…

python巧用定理判断素数

目录 判断一个数n是否是素数 求一个数的素因数个数 求大于等于指定数的最小素数 在数论中有三个非常重要的关于素数的定理 1、任何数都可以表示成若干个素数的乘积 2、任意数的一个素因子如果小于根号n&#xff0c;那么另一个与其对应的素因子必然大于根号n。 3、除了2和…