質問
私はいくつかのANSI C ++コードをC#に移植中です...これは今私を殺しています。
両方のテストの value = 6844268
があります。
テストコード:
value >> 12
value & 0x00000FFF
C ++は18273と29497を返しますが、C#は1670と3948を返します。 >
C ++の元の値はunsigned intです。誰にもアイデアはありますか?
編集:ああ、デバッグを台無しにしました。値の代わりに配列[値]を見ていました。私の悪い。
解決
C ++定義で上書きされた>>
演算子コードを確認しますか?
C#は正しい値を計算しています。あなたの値があなたの言うとおりであることを絶対に100%確信していますか?
モーションを確認するだけです:
6844268 = 11010000110111101101100
>> 12 = 11010000110.111101101100
result = 11010000110
result = 2 + 4 + 128 + 512 + 1024 = 1670
18273 = 100011101100001
6844268 >> 12 = 11010000110
^^^^ ^^^ <-- mismatches
これらは整列していません。コードに表示されていない詳細があるはずです。
他のヒント
C ++が何をするのかわかりませんが、私の計算機ではC#の値は正しいです。これはおそらく符号拡張の問題ですか(C ++の値は負であり、シフトはそれで上位1ビットをドラッグしていますか?
また、0xFFFが4095であることを考えると、&amp;操作はそれより大きい値を返すことができます。
私には正しいようです...
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;
};
オーバーライドされない&gt;&gt;オペレーター。これは関連する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
所属していません StackOverflow