操作员班次溢出?和UInt64

时间:2013-11-12 12:20:09

标签: c# .net

我尝试将一个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 key =(zoom&lt;&lt; 56)| (x <&lt; 28)| (y <&lt; 0);给了我一个非常大的数字。

准确地说:

如果zoom = 1,它会给我缩放&lt;&lt; 56 = 72057594037927936

如果x = 32,它给我(x <&lt; 28)= 8589934592

之前的结果可能是0?

我查看了文档http://msdn.microsoft.com/en-us/library/f96c63ed(v=vs.110).aspx,并说:

  

如果类型是无符号的,则将它们设置为0.否则,它们将填充符号位的副本。对于没有溢出的左移运算符,语句

在我的情况下,当使用无符号类型或者我的.net转换可能不好时,我似乎出现溢出?

0 个答案:

没有答案