Two's complement(补码)整数满足哪些常规整数算术运算性质?
补码整数算术性质验证结论
我们首先明确判断标准:性质成立指等式两边经过补码运算后的最终截断结果相等,不要求和无界整数的数学运算结果一致。以下结论分两种场景说明:
场景1:固定N位宽硬件级补码运算(溢出默认模2^N环绕截断,无隐式类型提升)
该场景下补码运算本质是模2^N的整数运算,模运算天然满足所有列出的算术性质,和符号无关:
- 加法交换律
a + b == b + a:完全成立 - 加法结合律
(a + b) + c == a + (b + c):完全成立 - 乘法交换律
a * b == b * a:完全成立 - 乘法结合律
(a * b) * c == a * (b * c):完全成立 - 乘法对加法的分配律
a * (b + c) == a * b + a * c:完全成立
场景2:常用编程语言实现
该场景下受语言规则限制,部分性质可能不成立:
- 加法交换律始终成立,不受符号、溢出、类型提升影响。
- 对于Java、Rust(release模式默认溢出行为)等明确定义有符号整数溢出为模2^N环绕的语言,上述所有性质均完全成立。
- C/C++中有符号整数溢出属于未定义行为,一旦触发溢出,除交换律外的其余性质都无法保证成立,编译器优化可能导致等式两边结果不一致。
- 若运算过程中存在隐式类型提升(比如8位char、16位short运算时先提升为32位int),截断时机不同可能导致结合律、分配律不成立。
- 无符号整数的运算规则是明确定义的模2^N环绕,所有上述性质均完全成立。
内容的提问来源于stack exchange,提问作者bumbread
相关产品推荐
相关产品推荐

