0

次の C コードを検討してください。

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

194 ( ) が正しく出力され0xc2ます。同じことを に書くとwcalc、結果は 195、つまり0xc3. これはある種の精度エラーですか?これは予想される動作ですか?floorおよびceiling関数は機能しません...または、より具体的に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

実際には、wcalc はx >> y整数ビットシフト演算子 (シフトされたビットを右側から削除するだけ) としてではなく、x の 2^y による浮動小数点除算として扱います。したがって:

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

0xa3 >> 6そして、これは単純に 2である C バージョンとの違いを説明しています。

于 2009-09-23T15:32:05.347 に答える
2

私は wcalc の作者です。バージョン 2.3.1 を使用している必要があります (これはほぼ 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 に答える