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;
}
相关推荐
大白话_NOI18 分钟前
【洛谷 P2678】 [NOIP2015 提高组] 跳石头 超详细题解
c++·算法
chase_my_dream1 小时前
LeGO-LOAM 详细源码流程解读
c++·计算机视觉·自动驾驶
A.零点1 小时前
【2个月 C 语言从入门到精通:零基础系统教程】第十二讲:深入了解指针(五)
c语言·开发语言·网络·笔记·visual studio
插件开发2 小时前
vs2015 cuda c++ 线程号的计算详解
开发语言·c++·算法
有点。2 小时前
C++(前缀和与差分)
c++·算法
c++之路2 小时前
Bazel C++ 构建系列文档(五):多目标与多包项目
java·开发语言·c++
Hello:CodeWorld2 小时前
【C++ 避坑指南】告别缓冲区溢出!全面解析 std::snprintf 的安全美学与核心陷阱
开发语言·c++·安全
凡人叶枫2 小时前
Effective C++ 条款38:通过复合塑模出 has-a 或 \“根据某物实现出\
linux·开发语言·c++·windows
2601_951643722 小时前
1 章 C语言概述
c语言·编程语言·历史·标准·优缺点
凡人叶枫2 小时前
Effective C++ 条款40:明智而审慎地使用多重继承
java·数据库·c++·嵌入式开发·effective c++