
目录一、核心原理int 等固定长度整数的 “容量有限”二、正溢出公式溢出 / 正式溢出例子32 位 int三、负数溢出下溢 / 反向溢出例子32 位 int四、为什么游戏能被利用代码设计弱点五、一句话总结先把名词对齐一下 你说的公式溢出、负数溢出、正式溢出在游戏开发里一般统称为整数溢出Integer Overflow其中公式溢出计算伤害、金币、经验等公式时结果超出类型上限负数溢出数值向下溢出小于类型最小值或正溢出后变成负数正式溢出应该是 “正溢出Positive Overflow”即超过正数上限。它们本质都利用了同一个底层原理固定位宽的整数类型用补码存储超出范围会 “回绕”且游戏代码默认不做溢出校验。一、核心原理int 等固定长度整数的 “容量有限”游戏里伤害、金币、属性、经验大多用32 位有符号整数int32存储范围-2³¹ ~ 2³¹−1即-2147483648 ~ 2147483647二进制最高位是符号位0 正1 负可以想象成只有 10 位的里程表最大9999999999再加 1 → 变成 0000000000直接回绕计算机里是二进制回绕而且会把 “进位” 丢掉只保留低 32 位。二、正溢出公式溢出 / 正式溢出表现数值太大 → 突然变很小或变负数。例子32 位 int最大值2147483647二进制0111...1111加 1数学2147483648实际二进制1000...0000解释符号位变成 1→ 被解释为负数-2147483648游戏里怎么用伤害公式攻击 × 倍率 × Buff叠太高 → 溢出变负数逻辑游戏判断if (伤害 0)才扣血 →负数伤害变成回血金币 / 经验溢出 → 变成负数绕过 “上限检查”甚至直接刷满三、负数溢出下溢 / 反向溢出表现数值太小比最小值还小→ 突然变很大正数。例子32 位 int最小值-2147483648二进制1000...0000减 1数学-2147483649实际二进制0111...1111解释符号位变成 0→ 被解释为正数2147483647游戏里怎么用把血量、金币故意减到极小→ 下溢变超大正数例如血量 1 - 1000000→ 下溢 → 血直接变成 21 亿无敌四、为什么游戏能被利用代码设计弱点默认不校验溢出C/C/C# 等默认unchecked溢出不报错直接回绕。开发觉得 “玩家打不出这么高伤害”省了校验代码。用了有符号类型signed int无符号uint溢出是从大到小255→0不会变负有符号会正负翻转最容易出 BUG。校验逻辑只判断 “正数上限”常见写法if (gold MAX_GOLD) gold MAX_GOLD;负数完全不拦→ 溢出成负数后绕过上限甚至可以再溢出刷满。公式叠乘、递归翻倍技能、Buff、装备多次 “×2” → 指数增长很快顶破 int 上限。五、一句话总结公式 / 正式溢出正数超出2147483647→变负数利用回绕 符号位翻转负数溢出负数低于-2147483648→变超大正数利用反向回绕本质补码存储 固定位宽 无溢出校验 有符号类型共同造成的 “数值绕圈”。