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;
}
相关推荐
千谦阙听12 小时前
C++篇:类和对象(上)
开发语言·c++
LONGZETECH13 小时前
新能源汽车动力电池实训教学痛点与虚拟仿真技术解决方案
c语言·3d·unity·架构·汽车·汽车教学软件
_Narcissus_13 小时前
分治&递归
数据结构·c++·笔记·算法·leetcode·递归·分治
牛油果子哥q14 小时前
C++ Socket精讲:TCP/UDP套接字、客户端服务端实现、字节序、粘包拆包、简单HTTP服务、网络踩坑与面试全解
网络·c++·tcp/ip
程与留14 小时前
12_常用控件速查(下):QSpinBox、QSlider、QProgressBar、QCheckBox
c++·qt
OPEN-F14 小时前
C++进阶教程:运算符重载与类型转换
java·c++·算法
uoKent15 小时前
c++中的extern关键字
开发语言·c++
jimy115 小时前
c++隐式移动构造、强制拷贝省略、返回具名局部变量
开发语言·c++
v_for_van15 小时前
C语言__attribute__
服务器·c语言·开发语言·mcu·嵌入式·嵌入式实时数据库