存在溢出时的整数运算

时间:2013-10-06 03:30:31

标签: c++ c integer-arithmetic

根据以下规则处理两个32位整数值A和B,以给出32位整数C和D.哪些规则是可逆的? 也就是说,在所有情况下都可以得到给定c和D的A和B吗?

一个。 C =(int32)(A + B),D =(int32)(A-B)

B中。 C =(int32)(A + B),D =(int32)((A-B)>> 1)

℃。 C =(int32)(A + B),D = B

d。 C =(int32)(A + B),D =(int32)(A + 2 * B)

电子。 C =(int32)(A * B),D =(int32)(A / B)

关于整数运算的几个问题。模块化加成形成称为阿贝尔群的数学结构。 签名加法怎么样?它也是可交换的(这是“阿贝尔”部分的来源)和关联,这是一个阿贝尔群组

鉴于整数加法是可交换和关联的,C显然是正确的,因为我们可以通过(A +(B-B))检索A. D怎么样?我们可以假设2 * B = B + B st。 B = A+B+B-(A+B)

乘法更复杂,但我知道如果有溢出则无法检索A.

1 个答案:

答案 0 :(得分:8)

这是5 [expr]第4段的引用:

  

如果在评估表达式期间,结果未在数学上定义或未在其类型的可表示值范围内,则行为未定义。

使无符号整数工作的溢出的原因在3.9.1 [basic.fundamental]第4段中定义:

  

无符号整数应遵守算术模2 n 的定律,其中n是该特定整数大小的值表示中的位数。

基本上这表示使用有符号整数运算时不会溢出。如果你这样做,所有的赌注都会被取消。这意味着有符号整数不会在C ++中形成Abelian组。