减法溢出翻转导致的死循环

减法运算及其溢出处理 减法运算及其溢出处理前言一、加减法溢出处理1.溢出的定义2.溢出的判别方法二、补充知识1.移位2.有符号数和无符号数之间的转换3.不同字长数整数之间的转换4.定点数表示法总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、加减法溢出处理 1.溢出的定义 ◆当运算结果超出机器数所能表示的范围时。 ◆ 与最高位产生的进位区别: 阅读详情

下面的代码有没有问题?

#include <cstdio>

int main()
{
	unsigned int a = 10;
	int b = 10;
	/* loop 1 */
	while(a>0)
	{
		a -= 3;
		printf("a=%u\n", a);
	}
	/* loop 2 */
	while(b>0)
	{
		b -=3;
		printf("b=%d\n",b);
	}
	return 0;
}

循环1,假如a是某个数据的剩余长度,每次处理3个字节,处理完退出,好像没有什么问题,但是程序真的会如你所预料的那样运行吗?

当然不会,要不然你就不会看到这篇blog了。

程序输出a的值是:7,4,1,4294967294,4294967291,......

1-3溢出之后=4294967294,循环永远不会结束!

循环2,输出结果是:7,4,1,-2

为什么会出现这个问题?因为循环每次变化的大小是3,而unsigned int与循环结束条件之间的间隙只有1,如果循环每次变化的大小>1,循环结束条件将恒不成立。

如何避免:

1、使用加法代替减法,避免溢出翻转,类似for循环的i++;

2、使循环每次变化量<数据最小值与循环结束条件之间的间隙。比如loop 2的int最小值-2147483648与循环结束条件<=0之间的间隙是2147483648,远远大于循环步进3.

 

 

gcc编译(一)download_prerequisites 根据网络上,一说编译gcc,第一道程序就是./download_prerequisites,然后一大堆安装流程,可是里面的道道,却被有关专家不扯淡,总有种云里雾里的感觉,我还是觉得看看它的代码比较好,打开它的代码,vi ./download_prerequisites #! /bin/sh # Download some prerequisites needed by gcc. # Run... 阅读详情

相关推荐

在Arduino UNO上移植FreeRTOS实现双LED并发闪烁的实践指南

实时操作系统(RTOS)是嵌入式开发中实现多任务并发的核心技术,其核心原理是通过任务调度器管理多个独立任务,使单核MCU能够高效处理多个并行逻辑。FreeRTOS作为轻量级开源RTOS内核,在资源受限的微控制器上尤为适用,其价值在于将复杂的时序逻辑拆分为独立任务,避免传统delay()函数的阻塞问题,提升系统响应能力与资源利用率。在Arduino UNO这类仅有2KB RAM的8位AVR平台上移植FreeRTOS,是对内存管理、任务调度等底层机制的深度实践,能够帮助开发者理解RTOS在**资源受限环境**下

weixin_34380948的博客 342

C++学习记录:循环语句中unsigned int死循环问题

C++学习:循环语句中unsigned int死循环问题 代码 for (unsigned int count = 9; count >= 0; --count) cout << count << " "; 程序陷入死循环 原因,当count=0时,二进制补码存储为全0,再减一,变为全1,在unsigned int中为2^32-1,陷入死循环 ...

你不懂猪刚鬣 718

单片机开发进阶:从阻塞延时到非阻塞状态机的并发编程实践

在嵌入式系统开发中,实时性和资源效率是核心考量。传统的顺序执行与阻塞延时会导致CPU空转,系统响应性差。其原理是让程序在延时函数中循环等待,占用全部CPU资源。这在高并发需求场景下价值有限。非阻塞编程通过状态机和时间片轮询,实现了模拟多任务并发。核心思想是记录事件起点,在等待期间释放CPU处理其他事务,通过定时检查时间差来触发状态切换。这种模式在智能家居控制、工业自动化等需要同时处理按键、显示、通信的嵌入式场景中至关重要。本文以SysTick定时器和状态机模型为例,深入讲解了如何实现非阻塞延时,并重构一个多

weixin_30384217的博客 322

坏蛋unsigned int型造成的循环陷阱

下面的循环执行几次呢? unsigned int i=10; for(i=10;i>=0;i--) { printf("HELLO GIRL!\n"); } 11次?O(∩_∩)O~,其实它是个死循环! 为虾米?因为i是个unsigned int型,当减小到0时,再减1变成2^32-1,判断条件仍然成立! 把判断条件写成i!=0就好了。我好像在C++ Primer上

1155

C语言-大数减法

大数减法

w365904的博客 1112

RT-Thread系统时钟深度解析:从Tick机制到实时调度优化

系统时钟是实时操作系统(RTOS)的核心组件,它为任务调度、延时和定时器管理提供时间基准。其工作原理基于硬件定时器产生周期性中断(Tick),驱动内核更新全局时间戳并检查任务状态。在嵌入式开发中,系统时钟的配置直接影响实时性和功耗,例如通过调整Tick频率平衡精度与开销,或利用Tickless模式实现低功耗。对于RT-Thread这类RTOS,理解时钟机制有助于优化任务调度、处理软件定时器回调,并避免时间溢出等常见问题。本文聚焦RT-Thread的时钟初始化、中断服务流程及时间API应用,为嵌入式实时系统设

weixin_30333885的博客 395

嵌入式系统底层探秘:从键盘中断到CPU核心的HCS08实战解析

在嵌入式系统开发中,中断机制是连接外设与CPU核心的关键桥梁,它允许处理器在响应外部事件时,无需持续轮询,从而高效管理多任务与实时事件。其工作原理涉及中断控制器对事件的检测、标志位的管理,以及CPU通过硬件自动保存现场、跳转执行服务程序并精准返回。这一机制的技术价值在于提升系统响应效率与实时性,是实现低功耗唤醒、实时控制等功能的基石。应用场景广泛,从简单的按键检测到复杂的工业控制均依赖于此。本文以NXP HCS08系列微控制器为例,聚焦键盘中断模块的寄存器配置、防误触技巧,并深入剖析CPU核心寄存器与七种寻

crazybug1987的专栏 385

嵌入式C语言控制流:顺序、分支、循环的硬件级实现与工程实践

程序控制流是所有软件运行的基础逻辑范式,其本质是CPU依据状态寄存器(如APSR)执行顺序跳转、条件分支与循环迭代。在嵌入式系统中,控制流直接映射到硬件初始化时序、中断响应机制与外设状态同步等物理约束。理解if语句的底层汇编实现(如CMP+BLT)、短路求值的安全价值,以及循环中volatile变量与标志位更新的严格耦合,是保障实时性与可靠性的前提。典型应用场景包括传感器数据采集判断、RTOS任务状态切换、电机PID闭环控制等。本文聚焦C语言三大控制结构在STM32与ESP32平台上的工程落地,覆盖从裸机驱

weixin_42389113的博客 623

Arduino语法速查手册:核心函数、避坑指南与高效调试技巧

在嵌入式开发与物联网项目中,微控制器编程是连接硬件与逻辑的基石。其核心原理在于通过编写代码控制引脚电平、读取传感器数据、管理时间与通信,从而实现智能设备的各项功能。掌握基础语法与核心函数能极大提升开发效率与系统稳定性,对于快速原型开发、自动化控制及教育实践等领域至关重要。本文聚焦Arduino平台,针对millis()非阻塞延时和analogRead()模拟输入等高频使用但易混淆的函数,提供快速查询、原理剖析及典型应用场景,旨在成为开发者手边的实用备忘录与调试指南。

weixin_30323631的博客 374

全面讲解MicroPython内置模块的初步应用

深入浅出地讲解MicroPython内置模块的使用方法,帮助开发者快速掌握micropython在实际项目中的基础操作与核心功能,提升嵌入式开发效率。

weixin_31938351的博客 557

STM32微秒级延时实现:从HAL_Delay到定时器精准控制

在嵌入式系统开发中,延时控制是基础且关键的技术环节。其核心原理依赖于微控制器的定时器单元,通过时钟源分频与计数器累加来度量时间。精确的延时对于驱动高速外设、模拟通信时序(如I2C、SPI)以及满足传感器精确时序要求至关重要,直接影响到系统的稳定性和性能。在STM32等ARM Cortex-M系列MCU中,开发者常使用SysTick或通用定时器实现延时功能。通过合理配置定时器的预分频器(PSC)和自动重装载值(ARR),可以构建高精度的微秒级延时函数,替代默认的毫秒级HAL_Delay。本文聚焦于利用通用定时

weixin_34101229的博客 310

手写qsort:深入C语言内存协议与工业级快排实现

qsort是C语言中最具代表性的泛型算法接口,其本质并非排序逻辑本身,而是基于void*的内存块重排协议。它揭示了函数指针契约、字节对齐约束、递归栈管理及类型擦除等底层原理。理解qsort需从内存操作视角切入——如何通过char*偏移定位元素、为何size参数决定swap字节数、比较函数为何必须严格返回-1/0/1而非布尔值。这些机制直接关联嵌入式开发中的栈溢出防控、裸机移植适配与结构体安全排序。本文以可调试、可嵌入的生产级qsort模拟实现为载体,贯通C89语法、三数取中优化、尾递归降深与小数组插入排序等

weixin_30326741的博客 454

ARM Cortex-M数据处理指令实战:从算术逻辑到标志位与优化

在嵌入式系统开发中,数据处理指令是CPU执行算术、逻辑和移位等运算的基础。其核心原理在于通过ALU对寄存器或立即数进行操作,直接影响程序的执行效率和正确性。掌握数据处理指令的技术价值在于,开发者能够编写出更高效、稳定的底层代码,尤其在资源受限的微控制器(MCU)环境中。这些指令广泛应用于外设寄存器配置、传感器数据处理、通信协议实现等场景。本文聚焦于ARM Cortex-M内核,深入解析算术与逻辑指令的实战应用,并探讨条件标志位与移位操作在代码优化中的关键作用。通过理解指令对标志位的影响和桶形移位器的妙用,开

weixin_33884611的博客 469

STM32工程管理与SysTick定时器:从V3.5库函数设计到精准延时实践

在嵌入式系统开发中,定时器是核心基础外设之一,用于实现精准时序控制、任务调度和系统节拍。其工作原理基于计数器与时钟源的配合,通过中断或查询模式触发特定操作。对于Cortex-M内核微控制器,SysTick作为内置系统定时器,为操作系统提供稳定时基,同时在裸机程序中也可用于实现高效延时。STM32标准外设库V3.5版本对SysTick的封装进行了精简,通过SysTick_Config()函数引导开发者更规范地使用这一资源,体现了模块化与接口标准化的工程价值。本文结合STM32F10x系列,从工程目录结构优化切

weixin_30764771的博客 1001

MPC5500中断与定时器实战:从时间基准到中断嵌套的底层解析

在嵌入式系统开发中,中断和定时器是实现实时响应的核心技术。中断机制允许处理器即时响应外部事件,而定时器则为系统提供了精确的时间基准。理解其底层原理,如特殊功能寄存器的操作和中断向量机制,是构建稳定可靠系统的关键。这些技术广泛应用于汽车电子、工业控制等对实时性要求极高的领域。本文以恩智浦MPC5500系列微控制器为例,深入剖析其时间基准、递减器和固定间隔定时器的工作原理,并通过实战代码演示如何配置中断服务程序、管理堆栈帧以及实现中断嵌套。文章重点解析了中断标志清除、现场保存与恢复等易错细节,并结合汇编与C语言

weixin_30883311的博客 436

TMS320C6746关键外设实战:uPP、VPIF、eCAP与eHRPWM配置指南

在嵌入式DSP系统开发中,高效可靠的外设接口配置是实现数据采集、视频处理和实时控制的核心。其原理在于通过直接内存访问(DMA)技术,使外设能独立于CPU核心搬运数据,从而释放算力专注于算法处理。这种设计对于提升系统实时性和整体性能具有重要价值,广泛应用于工业视觉、电机驱动和数字电源等场景。以德州仪器TMS320C6746 DSP为例,其集成的通用并行端口(uPP)和视频端口接口(VPIF)便是实现高速数据流传输的典型模块,前者专为点对点并行通信优化,后者则直接解析BT.656/1120等标准视频流。理解这些

weixin_30363981的博客 640

翻卡片博弈题:用GF(2)线性代数破解蓝桥杯C++国赛硬核思维

翻卡片类问题本质是组合博弈论在有限状态空间的具象化,其核心在于将连续翻转操作建模为GF(2)域上的向量异或运算——这使问题从指数级搜索降维为二元域线性方程组求解。借助高斯消元判断Ax=b是否有解,可严格判定先手必胜性,该方法兼具理论严谨性与工程可实现性。它不仅是蓝桥杯C++国赛高频考点,更对应芯片验证、嵌入式控制等工业场景中的寄存器配置与状态可达性分析。关键词‘翻卡片’‘蓝桥杯’直指这一从逻辑建模到bitset位运算落地的完整技术链。

weixin_34021089的博客 356

P89LPC90x系列MCU:低成本、低功耗8051方案与嵌入式设计实战

微控制器(MCU)作为嵌入式系统的核心,其选型直接影响产品的成本、功耗与可靠性。基于经典的8051架构,现代MCU通过增强内核、集成丰富外设与优化电源管理,在物联网终端、便携设备等场景中展现出强大竞争力。其技术价值在于以极简的外围电路实现复杂功能,大幅降低BOM成本与PCB面积。例如,通过高度集成的FLASH存储器、EEPROM、模拟比较器和UART,配合动态时钟调整与多种低功耗模式,可轻松构建平均电流低于10μA的电池供电系统。本文以恩智浦P89LPC906/907/908系列为例,深入解析其增强型80C

weixin_34236869的博客 334
上一篇: arm-linux-gnueabihf、aarch64-linux-gnu等ARM交叉编译GCC的区别
下一篇: Linux和Windows都可用的串口调试助手
Segment fault
博客等级 码龄11年 17粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值