我已将Java代码移植到C#。 你能解释为什么我在后续行中有编译时错误(我使用VS 2008):
private long l = 0xffffffffffffffffL; // 16 'f' got here
无法将源类型ulong转换为目标类型long
我需要与原始Java代码相同的值。
答案 0 :(得分:3)
假设您不担心负值,可以尝试使用unsigned long
:
private ulong l = 0xffffffffffffffffL;
在Java中,l
的实际值为-1
,因为它会溢出2^63 - 1
最大值,因此您只需用-1
替换常量。< / p>
答案 1 :(得分:3)
Java并不介意在这种特殊情况下是否有一个常量溢出 - 你给出的值实际上是-1。
在C#中实现相同效果的最简单方法是:
private long l = -1;
如果你想保留你可以使用的16 fs:
private long l = unchecked((long) 0xffffffffffffffffUL);
如果实际上想要签名长的最大值,则应使用:
// Java
private long l = Long.MAX_VALUE;
// C#
private long l = long.MaxValue;
答案 2 :(得分:2)
0xffffffffffffffff
大于已签名的长号可以表示的内容。
您可以插入演员:
private long l = unchecked( (long)0xffffffffffffffffL);
由于C#使用两个补码,0xffffffffffffffff
代表-1
:
private long l = -1;
或者将变量声明为无符号,如果你想表示位模式,这可能是最干净的选择:
private ulong l = 0xffffffffffffffffL;
private ulong l = ulong.MaxValue;
一个长期的最大值是:
private long l = 0x7fffffffffffffffL;
但最好写成long.MaxValue
。
答案 3 :(得分:0)
你可以这样做:
private long l = long.MaxValue;
...但正如mdm指出的,你可能真的想要一个ulong。
private ulong l = ulong.MaxValue;