我已將Java代碼移植到C#。 能否請您解釋一下爲什麼我編譯時錯誤在後續線(我用VS 2008):長類型的最大HEX值
private long l = 0xffffffffffffffffL; // 16 'f' got here
無法轉換源ulong類型到目標類型長
我需要相同的值這裏至於原始Java代碼。
我已將Java代碼移植到C#。 能否請您解釋一下爲什麼我編譯時錯誤在後續線(我用VS 2008):長類型的最大HEX值
private long l = 0xffffffffffffffffL; // 16 'f' got here
無法轉換源ulong類型到目標類型長
我需要相同的值這裏至於原始Java代碼。
假設你不擔心負值,你可以嘗試使用unsigned long
:
private ulong l = 0xffffffffffffffffL;
在Java中的l
實際價值將是-1
,因爲它會溢出2^63 - 1
最大值,所以你可以用-1
代替你的常數。
嗯...但對於Java我的價值意味着「-1」,但在這裏 - 不是。別? – 2012-01-11 19:32:03
是的,因爲C#關心溢出值。 Java並不那麼嚴格並且允許它。 – mdm 2012-01-11 19:34:03
你可以這樣做:
private long l = long.MaxValue;
...但作爲MDM指出的那樣,你可能真的想要一個ULONG。
private ulong l = ulong.MaxValue;
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;
但是爲什麼以十六進制表示的「-1」不能被分配給64位有符號長? – 2012-01-11 19:38:01
你沒在聽。 0xffffffffffffffff在十六進制中不是-1,十六進制是18,446,744,073,709,551,615。 – 2012-01-11 19:49:41
@MichaelZ:0xfff ...當它溢出一個有符號的long的邊界時只有-1。你可以使用-0x1,它是十六進制的*真* 1。 – 2012-01-11 20:34:54
0xffffffffffffffff
大於一個有符號的long可以表示。
您可以將投:
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
。
當你這樣做時,你沒有在Java中遇到錯誤嗎?無論如何,結果都是-1,不是嗎? Java的長類型也被簽名。 – 2012-01-11 19:31:19
在這種情況下,Java都可以使用。是的,在Java中結果是「-1」,但是如果C#也是如此 - 爲什麼我的值不能被分配? – 2012-01-11 19:36:47
在這種情況下,您問題中的措詞不正確。每個人都假設你想要長時間的最大價值。而-1不是。另一方面,如果你想-1,爲什麼不寫-1? – 2012-01-11 19:47:13