首页 > 试题广场 >

有两个32bit的数A、B,使用下面方式得到32bit的数C

[单选题]
有两个32bit的数A、B,使用下面方式得到32bit的数C、D。哪一种可以使用C、D得到A、B的值?
  • C=(int32)(A+B),D=(int32)(A-B)
  • C=(int32)(A+B),D=(int32)((A-B)>>1)
  • C=(int32)(A+B),D=B
  • C=(int32)(A+B),D=(int32)(A+2*B)
  • C=(int32)(A*B),D=(int32)(A/B)
  • 都不可以,可能溢出
推荐
。头像
C
第一项:A=(C+D)/2,B=C-A
第二项:D右移一位,不知道移出的是1还是0,不能恢复
第三项:A=C-D,B=D
第四项:B=D-C,A=C-B
第五项:虽然可以C*D再开方,但是不能确定A和B的正负
但是对于无符号数,A不行,这里简单起见,以3bit数为例。例如A=111,B=110。C=A+B=001(溢出),D=A-B=001,所以A不能正确恢复了。C仍然可以,A=C-D=001-110=111。D答案,同样因为溢出不能恢复。
编辑于 2015-06-19 20:55:25 回复(8)
选C:
当A+B未溢出时,A=C-D;
当A+B溢出时,A=C+2^32-D; 因为溢出相当于减去了2^32。
所以合起来的计算公式为:  A=(C+2^32-D)%2^32 (取余数)
A:INT_MAX B:INT_MAX,验证正确。
发表于 2015-03-25 21:51:44 回复(3)
溢出不影响减法,但是影响除法
发表于 2015-08-20 01:14:33 回复(0)
哪位大神可以解释下呢?看不懂现有的解释?
发表于 2017-07-08 16:18:14 回复(0)
假设以4bit举例,A:1111,B:1110,C=A+B=1101(高位溢出),D=B=1110;
此时A=C-D=1101+0010=1111,确实能得到A,其中0010为D的补码。
发表于 2015-08-17 16:35:06 回复(0)

注意考虑整数溢出问题,对于有符号数,A、C、D通过下面方式都可以恢复

第一项:A=(C+D)/2,B=C-A

第二项:D右移一位,不知道移出的是1还是0,不能恢复 第三项:A=C-D,B=D

第四项:B=D-C,A=C-B

第五项:虽然可以C*D再开方,但是不能确定A和B的正负

但是对于无符号数,A不行,这里简单起见,以3bit数为例。例如A=111,B=110。

C=A+B=001(溢出),D=A-B=001,所以A不能正确恢复了。C仍然可以,A=C-D=001-110=111。D答案,同样因为溢出不能恢复。

发表于 2015-04-14 17:18:04 回复(4)
可以尝试实例法,将32变成2或者3试试,然后排除法
发表于 2016-07-25 20:30:01 回复(0)
乘除法,左移右移都不行。
发表于 2016-02-21 10:15:10 回复(0)
两个n位数相加,如果有溢出,则二者的计算结果相当于实际结果值减去2^n.根据该原则,C项,不管A+B是否有溢出,都能根据C、D计算出A、B的值。
发表于 2015-08-18 22:44:28 回复(0)
B可以则A必定可以所以排除
A很明显会发生溢出不能恢复
D同样的原因, 考虑c, d可能是同时溢出的结果,不可能在恢复
E项, A/B可能不是整除, 也不能恢复
现在看看C项:
虽然c的值可能溢出,但通过一直对d的增加,总能找到一个数(x) 使得d + x = c,则x为A.
答案: C
发表于 2015-07-08 00:47:19 回复(0)
答案C.假设A+B越界,B为正,则当A为正时A+B范围为[-max,B-max+1]U(B,max],A为负时A+B范围为[B-max,B)。补充:后面答题的朋友可不可以扯扯计算机原理的补码神马滴。要深入一点。
编辑于 2015-05-10 21:32:51 回复(0)
D项 为什么不能2c-d 得到 a呢?
担心溢出吗?
发表于 2019-09-06 17:16:18 回复(0)
溢出不影响加减法但是影响除法
发表于 2018-03-25 23:19:37 回复(0)
看不懂题目。有哪位老师可以指点一下?谢谢
发表于 2018-03-10 12:29:11 回复(0)
对于D怎么理解呢?能举个例子么?

发表于 2017-04-22 09:24:31 回复(0)
溢出不影响减法,但影响除法。
发表于 2016-10-08 08:00:49 回复(0)
溢出不影响减法,影响除法1
发表于 2016-08-01 11:28:28 回复(0)
这里使用C、D得到A、B的值的意思是使用C、D再去计算A和B的值。
发表于 2015-08-24 14:14:58 回复(0)
C选项是对的大家意见都比较统一,但对于D选项我有疑问,令A+B=N,则D选项可以表示为C=(int32)(N),D=(int32)(N+B),注意到跟C选项形式上是一样的,因此可以得到B的值,在得到B的值后,如果直接令D=B,不就得到C选项了吗?结论就是由C选项可以证明D选项也是对的。大家觉得以上分析对吗?
发表于 2015-08-22 11:28:21 回复(0)

D项验证了一下,也是正确的。
int A = INT_MAX;
int B = INT_MAX;
int C= (int)(A+B) , D=(int)(A+2*B);
cout << (int)(D-C) << endl;
cout << (int)(C-(D-C)) << endl;
结果:2147483647
           2147483647
将int改为unsigned int也是正确的
发表于 2015-08-18 18:02:29 回复(0)
小数的精度问题排除A、B、E;溢出问题排除D和F;最后C正确
发表于 2015-08-18 17:36:04 回复(0)