-1

我正在将一些 ANSI C++ 代码移植到 C# 的过程中......现在这让我很生气。

两项测试都有value = 6844268.

测试代码:

value >> 12
value & 0x00000FFF

C++ 返回 18273 和 29497,而 C# 返回 1670 和 3948。我已经尝试了 C# 中所有可能的类型组合(int、uint、long、ulong、Int64...),但不行:(

C++ 中的原始值是无符号整数。有人有想法么?

编辑:啊,我搞砸了我的调试。正在查看数组 [值] 而不是值。我的错。

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 用于狼栅栏调试。

输出:

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 回答