0

考虑以下 C 代码:

  int c=((0xa3>>6)&0x1f)|0xc0;
  printf("%d\n",c);

它正确打印出 194 ( 0xc2)。如果我在 中写同样的东西wcalc,结果是 195,或者0xc3。这是某种精度错误吗?这是预期的行为吗?floorceiling功能不起作用......或者,更具体地说,floor适用于 0xa3,但不适用于 ,0xa1反之亦然。

任何帮助表示赞赏。谢谢。

4

4 回答 4

3

你为什么要问而不是测试?把它分解。你从以下得到什么?

0xa3>>6
(0xa3>>6)&0x1f
((0xa3>>6)&0x1f)|0xc0

Enter an expression to evaluate, q to quit, or ? for help:
-> ((0xa3>>6)&0x1f)|0xc0
 = 195
-> 0xa3>>6
 = 2.54688
-> (0xa3>>6)&0x1f
 = 3
-> ((0xa3>>6)&0x1f)|0xc0
 = 195
-> 

看到那条线"= 2.54688"。这对你来说是正确的吗?根据我的计算,0xa3>>6应该给你 2,当and用 编辑时0x1f,它仍然是 2。

如果您尝试以下操作,您会发现它>>没有给出整数结果:

Enter an expression to evaluate, q to quit, or ? for help:
-> 0xa3
 = 163
-> 0xa3>>1
 = 81.5
-> 0xa3>>2
 = 40.75
-> 
于 2009-09-23T15:26:00.973 回答
2

实际上,wcalcx >> y不将其视为整数移位运算符(它只是将移位的位从右侧移出),而是将 x 除以 2^y 的浮点除法。因此:

Enter an expression to evaluate, q to quit, or ? for help:
-> 0xa3>>6
 = 2.54688

这解释了相对于 C 版本的差异,其中0xa3 >> 6只是 2。

于 2009-09-23T15:32:05.347 回答
2

我是wcalc的作者;您必须使用 2.3.1 版(已过期近一年)。

您所看到的原因是 wcalc 在内部使用 mpfr 库中的任意精度浮点数,因此,它用于执行移位作为除法(因此可以处理诸如 1.5>>6 之类的事情)。2.4 版(2008 年 10 月发布)处理整数位移的方式略有不同,以产生类似 C 的结果(如您所料)。

对于它的价值,一个替代的命令行计算器是 bc (在我不公正的意见中,更旧,但使用起来更痛苦,并且没有那么多功能)。

于 2009-09-23T18:51:15.023 回答
1

这是一个整数运算,不涉及浮点精度问题。正确答案是准确的,正如您已经知道的,示例代码正确地报告了它。对我来说,这听起来像是“wcalc”(我不知道的工具)中的一个错误。

于 2009-09-23T15:24:56.240 回答