C语言中的整数安全:溢出、回绕

一、无符号数回绕

无符号数永远不会溢出,只是在无限的循环往复。对于加法、乘法,假装有额外的有效位来承载运算结果,最后再直接截断。

cpp 复制代码
for (uint32 i = n; i >= 0; i--) {
    ... // 死循环
}

加法例子

cpp 复制代码
uint8 sum =  ...;
uint8 i = ...;
if (sum + i > 255) {
    ; // 永远不会进入
}

减法例子

cpp 复制代码
uint8 sum =  ...;
uint8 i = ...;
if (sum - i < 0) {
    ; // 永远不会进入
}

二、溢出

数值0被表示为"正"数

cpp 复制代码
#define abs(n) ((n) < 0 ? -(n) : (n))

三、单边限制不完全

cpp 复制代码
void Func(int len) {
    int a = 0;
    int b = 0;
    int data[20] = {0};
    if (len < 20) {
        a = 1; // 执行
        unsigned int idx = len;
        data[idx] = 7; // 越界
    }
    if (len < 20u) {
        b = 1; // 未执行
    }
    return;
}
相关推荐
free-elcmacom3 分钟前
C++三种参数传递方式:从交换函数看值、指针与引用的区别
开发语言·c++
一叶落4386 分钟前
【LeetCode 172】阶乘后的零(C语言详解 | 数学规律 + 对数时间复杂度)
c语言·数据结构·算法·leetcode·动态规划
自信150413057597 分钟前
数据结构初阶——二叉树之——堆的实现
c语言·数据结构·算法
柏木乃一8 分钟前
Linux线程(8)基于单例模式的线程池
linux·运维·服务器·c++·单例模式·操作系统·线程
Trouvaille ~22 分钟前
【贪心算法】专题(三):排序、博弈与区间的贪婪法则
c++·算法·leetcode·青少年编程·面试·贪心算法·蓝桥杯
IT199533 分钟前
C++工作笔记-动态库中的单例类存储方式
开发语言·c++·笔记
小茗的嵌入式学习日记39 分钟前
基于IMX6ULL的车载中控系统
linux·c语言·qt
香水5只用六神1 小时前
【RTOS快速入门】05_动态_静态创建任务(2)
c语言·stm32·单片机·嵌入式硬件·freertos·rtos·嵌入式软件
一起搞IT吧1 小时前
Android功耗系列专题理论之十五:相机camera功耗问题分析方法
android·c++·数码相机·智能手机·性能优化
香水5只用六神1 小时前
【RTOS快速入门】06_任务状态理论讲解(1)
c语言·stm32·单片机·嵌入式硬件·freertos·rtos·嵌入式软件