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;
}
相关推荐
XFF不秃头5 小时前
力扣刷题笔记-下一个排列
c++·笔记·算法·leetcode
Logic1015 小时前
深入理解C语言if语句的汇编实现原理:从条件判断到底层跳转
c语言·汇编语言·逆向工程·底层原理·条件跳转·编译器原理·x86汇编
天赐学c语言5 小时前
12.16 - 全排列 && C语言中声明和定义的区别
c++·算法·leecode
zmzb01035 小时前
C++课后习题训练记录Day50
开发语言·c++
恶魔泡泡糖5 小时前
最小系统组成部分
c语言·单片机
HalvmånEver5 小时前
Linux:基础IO(终)
linux·运维·c++·学习·缓冲区·libc
laocooon5238578865 小时前
背包问题~~!C++
开发语言·c++·算法
iCxhust5 小时前
8088单板机C语言汇编混合编程实验方法与步骤
c语言·汇编·单片机·嵌入式硬件·微机原理
雨落在了我的手上6 小时前
C语言入门(二十八):动态内存管理(2)
c语言·开发语言
矢鱼6 小时前
python中对应c++容器的结构
开发语言·c++·python·算法