C#中的long不符合Java中Long的相同值

时间:2014-05-11 06:34:55

标签: c# java long-integer

static long[] Mask1=
{
        0xFF, 0xFF00, 0xFF0000, 0xFF000000, 
        0xFF00000000, 0xFF0000000000, 0xFF000000000000, 0xFF00000000000000
};

static long[] Mask2 =
{
        0x101010101010101, 0x202020202020202, 0x404040404040404, 0x808080808080808,
        0x1010101010101010, 0x2020202020202020, 0x4040404040404040, 0x8080808080808080
};

在Java中,我可以将这些值放入long []中。

但是在C#中,我认为他们不能'转换为长'。

我只能在C#中使用ulong,但是为什么Java long和C#long具有相同的容量? -9,223,372,036,854,775,808到9,223,372,036,854,775,807没有? 我需要额外的掩码吗?

具体来说,我的错误是:

"Constant value `18374686479671623680' cannot be converted to a `long'"

Constant value `9259542123273814144' cannot be converted to a `long'

2 个答案:

答案 0 :(得分:1)

long.MaxValue = 9223372036854775807
your value 1  = 18374686479671623680
your value 2  = 9259542123273814144

您的值大于已签名的长期可以容纳的值。这就是你必须使用unsigned。

的原因

答案 1 :(得分:0)

你必须在C#中使用'未经检查'的强制转换来获取超出范围的值:

static long[] Mask1 = {0xFF, 0xFF00, 0xFF0000, 0xFF000000, 0xFF00000000, 0xFF0000000000, 0xFF000000000000, unchecked((long)0xFF00000000000000)};

static long[] Mask2 = {0x101010101010101, 0x202020202020202, 0x404040404040404, 0x808080808080808, 0x1010101010101010, 0x2020202020202020, 0x4040404040404040, unchecked((long)0x8080808080808080)};