2

Objective-C プロジェクトを c# .net に変換しようとしましたが、数か月前は問題なく機能していましたが、現在何かを更新したところ、値が悪くなります。多分あなたは私が間違っていることを見るでしょう。

これは、 https://github.com/magiconair/map2sqlite/blob/master/map2sqlite.mの元の関数です。

uint64_t RMTileKey(int tileZoom, int tileX, int tileY)
{
        uint64_t zoom = (uint64_t) tileZoom & 0xFFLL; // 8bits, 256 levels
        uint64_t x = (uint64_t) tileX & 0xFFFFFFFLL;  // 28 bits
        uint64_t y = (uint64_t) tileY & 0xFFFFFFFLL;  // 28 bits

        uint64_t key = (zoom << 56) | (x << 28) | (y << 0);

        return key;
}

私のバグのある.netバージョン:

public UInt64 RMTileKey(int tileZoom, int tileX, int tileY)
{
    UInt64 zoom = (UInt64)tileZoom & 0xFFL; // 8bits, 256 levels
    UInt64 x = (UInt64)tileX & 0xFFFFFFFL;  // 28 bits
    UInt64 y = (UInt64)tileY & 0xFFFFFFFL;  // 28 bits

    UInt64 key = (zoom << 56) | (x << 28) | (y << 0);

    return key;
}

パラメータは次のとおりです。 tileZoom = 1、tileX = 32、tileY = 1012

UInt64 キー = (ズーム << 56) | (x << 28) | (y << 0); 私に信じられないほど大きな数を与えます。

正確に :

ズーム = 1 の場合、ズーム << 56 = 72057594037927936

x = 32 の場合、(x << 28) = 8589934592 となります。

多分0は前の結果でしたか?

ドキュメントhttp://msdn.microsoft.com/en-us/library/f96c63ed(v=vs.110).aspxを確認したところ、次のように書かれています。

タイプが符号なしの場合、それらは 0 に設定されます。それ以外の場合は、符号ビットのコピーで埋められます。オーバーフローのない左シフト演算子の場合、ステートメント

私の場合、符号なしの型を使用するとオーバーフローが発生するようですが、.net 変換が悪いのでしょうか?

4

0 に答える 0