-1

私はいくつかの ANSI C++ コードを C# に移植している最中です...そして、これは今私を殺しています。

両方のテストがありvalue = 6844268ます。

テストコード:

value >> 12
value & 0x00000FFF

C++ は 18273 と 29497 を返しますが、C# は 1670 と 3948 を返します。C# で考えられるすべての型の組み合わせ (int、uint、long、ulong、Int64...) を試しましたが、うまくいきません :(

C++ の元の値は unsigned int です。誰にもアイデアはありますか?

編集:ああ、デバッグを台無しにしました。値の代わりに配列[値]を見ていました。私の悪い。

4

4 に答える 4

5

>>オーバーライドされた演算子コードの C++ 定義を確認してください。

C# は正しい値を計算しています。あなたの値があなたの言う通りであると 100% 確信していますか?

モーションを実行するだけです:

6844268 = 11010000110111101101100
>> 12   =             11010000110.111101101100
result  =             11010000110
result  = 2 + 4 + 128 + 512 + 1024 = 1670

  18273       =   100011101100001
6844268 >> 12 =       11010000110
                        ^^^^  ^^^ <-- mismatches

コードに表示されていない詳細がいくつかあるはずです。

于 2008-12-31T08:32:56.363 に答える
3

C++ が何をしようとしているのかはわかりませんが、電卓では C# の値は正しいです。これはおそらく符号拡張の問題ですか (C++ の値は負であり、シフトによって上位 1 ビットがドラッグされていますか??)

また、0xFFF が 4095 であることを考えると、& 操作がそれより大きい値を返すことはありません。

于 2008-12-31T08:31:56.053 に答える
1

私には正しいようです...

sock@thebrain:~$ g++ test.cc
sock@thebrain:~$ ./a.out
6844268 1670 1670
6844268 1670 1670

sock@thebrain:~$ cat test.cc
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
unsigned int value = 6844268;
printf("%u %u %u\n", value, value >> 12, (value >> 12)&0xFFF);
cout << value << " ";
cout << (value>>12) << " ";
value = (value>>12)&0xFFF;
cout << value << endl;
return 0;
};
于 2008-12-31T09:00:02.907 に答える
0

オーバーライドされた >> 演算子はありません。これは、関連する C++ コード スニペットです。

[Function signature: const unsigned char *src, int len, char *dst]
unsigned short *sdst = (unsigned short*) dst;
unsigned short *slt = (unsigned short*) lookup_ext;

while (len >= 3) {
    unsigned int value = *src++ << 16;
    value |= *src++ << 8;
    value |= *src++;

    cout << value << endl;
    *sdst++ = slt[value >> 12];
    *sdst++ = slt[value & 0x00000FFF];

    cout << sizeof(unsigned short) << endl << slt[value >> 12] << endl << slt[value & 0x00000FFF] << endl;
    len -= 3;
}

ウルフフェンスのデバッグ用に cout が追加されました。

cout 出力:

6844268 | cout << value
2 | sizeof(unsigned short)
18273 | slt... Ohhhh sneaky. I mis-pasted that, nevermind - it's an slt issue [Output's the same now]
29497
于 2008-12-31T08:39:19.890 に答える