根据以下规则处理两个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.
答案 0 :(得分:8)
这是5 [expr]第4段的引用:
如果在评估表达式期间,结果未在数学上定义或未在其类型的可表示值范围内,则行为未定义。
使无符号整数工作的溢出的原因在3.9.1 [basic.fundamental]第4段中定义:
无符号整数应遵守算术模2 n 的定律,其中n是该特定整数大小的值表示中的位数。
基本上这表示使用有符号整数运算时不会溢出。如果你这样做,所有的赌注都会被取消。这意味着有符号整数不会在C ++中形成Abelian组。