2012-01-11 81 views
1

我已將Java代碼移植到C#。 能否請您解釋一下爲什麼我編譯時錯誤在後續線(我用VS 2008):長類型的最大HEX值

private long l = 0xffffffffffffffffL; // 16 'f' got here 

無法轉換源ulong類型到目標類型長

我需要相同的值這裏至於原始Java代碼。

+0

當你這樣做時,你沒有在Java中遇到錯誤嗎?無論如何,結果都是-1,不是嗎? Java的長類型也被簽名。 – 2012-01-11 19:31:19

+0

在這種情況下,Java都可以使用。是的,在Java中結果是「-1」,但是如果C#也是如此 - 爲什麼我的值不能被分配? – 2012-01-11 19:36:47

+0

在這種情況下,您問題中的措詞不正確。每個人都假設你想要長時間的最大價值。而-1不是。另一方面,如果你想-1,爲什麼不寫-1? – 2012-01-11 19:47:13

回答

2

假設你不擔心負值,你可以嘗試使用unsigned long

private ulong l = 0xffffffffffffffffL; 

在Java中的l實際價值將是-1,因爲它會溢出2^63 - 1最大值,所以你可以用-1代替你的常數。

+0

嗯...但對於Java我的價值意味着「-1」,但在這裏 - 不是。別? – 2012-01-11 19:32:03

+1

是的,因爲C#關心溢出值。 Java並不那麼嚴格並且允許它。 – mdm 2012-01-11 19:34:03

0

你可以這樣做:

private long l = long.MaxValue; 

...但作爲MDM指出的那樣,你可能真的想要一個ULONG。

private ulong l = ulong.MaxValue; 
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; 
+0

但是爲什麼以十六進制表示的「-1」不能被分配給64位有符號長? – 2012-01-11 19:38:01

+1

你沒在聽。 0xffffffffffffffff在十六進制中不是-1,十六進制是18,446,744,073,709,551,615。 – 2012-01-11 19:49:41

+1

@MichaelZ:0xfff ...當它溢出一個有符號的long的邊界時只有-1。你可以使用-0x1,它是十六進制的*真* 1。 – 2012-01-11 20:34:54

2

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