C# 操作员轮班溢出?和UInt64

C# 操作员轮班溢出?和UInt64,c#,.net,C#,.net,我试图将objective-c项目转换为c#.net,几个月前它运行得很好,但现在我更新了一些东西,它给了我不好的值。也许你会明白我做错了什么 这是来自的原始函数 uint64\u t RMTileKey(int tileZoom、int tileX、int tileY) { uint64_t zoom=(uint64_t)tileZoom&0xFFLL;//8位,256级 uint64_t x=(uint64_t)tileX&0xFFFFFFFLL;//28位 uint64_t y=(uint

我试图将objective-c项目转换为c#.net,几个月前它运行得很好,但现在我更新了一些东西,它给了我不好的值。也许你会明白我做错了什么

这是来自的原始函数

uint64\u t RMTileKey(int tileZoom、int tileX、int tileY)
{
uint64_t zoom=(uint64_t)tileZoom&0xFFLL;//8位,256级
uint64_t x=(uint64_t)tileX&0xFFFFFFFLL;//28位
uint64_t y=(uint64_t)tileY&0xFFFFFFFLL;//28位

uint64\u t键=(放大那些数字,我看是对的。你为什么不期待大数字出现呢?1@vines我猜大概是72057594037927936:删减代码不会给我一个溢出错误…答案是
72057602627862528
…你期待什么?顺便说一句,我会避免直接从
Int32
UInt64
因为这没有明确说明如何处理负值。使用
(UInt64)(Int64)i
(UInt64)(UInt32)i
来阐明您的意图或验证参数以强制执行它们从来都不是负值。这在您的代码中并不是一个真正的问题,因为您无论如何都会掩盖它,但在我看来,这是一种糟糕的风格。
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;
}
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;
}