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;
}
相关推荐
你怎么知道我是队长6 小时前
C++零基础第3周:if/else、switch、for/while/do-while 控制流完全指南(附20段可运行代码+避坑清单)
java·开发语言·c++
冻柠檬飞冰走茶6 小时前
PTA刷题集之Airline Routes(C语言实现)
c语言·开发语言·数据结构·算法
青少儿编程课堂6 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:倍增法求最近公共祖先LCA解析
c++·python·算法·bfs·信息学竞赛
冻柠檬飞冰走茶6 小时前
PTA刷题集之Battle Over Cities - Hard Version(C语言实现)
c语言·开发语言·数据结构·算法
雷✘7 小时前
C++ 类与对象的初始化机制、成员访问边界与拷贝优化
java·网络·c++
努力实干7 小时前
简单工厂模式(Simple Factory Pattern)——C++
开发语言·c++·简单工厂模式
東隅已逝,桑榆非晚9 小时前
算法2. 双指针法-复写零
c++·笔记·学习·算法
布莱克6059 小时前
C++ 中堆和栈的区别详解
开发语言·c++·栈·堆
誰能久伴不乏10 小时前
用 UDP 做一条“可靠“的控制通道
c++·qt·网络协议·udp
十五年专注C++开发10 小时前
FlatBuffers: 一个高效的零拷贝二进制序列化库
c++·序列化·反序列化·flatbuffers