存在溢出时的整数运算

zou*_*yjs 0 c c++ integer-arithmetic

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

A. C =(int32)(A + B),D =(int32)(AB)

B. C =(int32)(A + B),D =(int32)((AB)>> 1)

C.C =(int32)(A + B),D = B.

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

E. C =(int32)(A*B),D =(int32)(A/B)

关于整数运算的几个问题.模块化加成形成称为阿贝尔群的数学结构.签名加法怎么样?它也是可交换的(这是"阿贝尔"部分进入的地方)和联想,这是一个阿贝尔群体吗?

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

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

Die*_*ühl 8

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

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

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

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

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