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 変換が悪いのでしょうか?