2012-02-08 119 views
2

的目負我期待此行的C代碼轉換爲C#:無符號整數

const u64 a = 1, b = -a; 

所以我的理解是,這兩個常量是64位無符號整數。如果是這樣,結果會是什麼樣子?

或者是實際提升的第二個常量,因此定義爲有符號整數?

+0

你問你在C中運行的結果是什麼,或者等價的C#應該是什麼? – 2012-02-08 02:26:34

+0

爲什麼你想否定一個unsigned int?這不是破壞目的嗎? – 2012-02-08 02:27:18

+0

@Chris:我在問兩個。 – RoadWarrior 2012-02-08 02:28:16

回答

1

由於behaviour of negating unsigned integers-(u64)1表示是全1。於是,經過如下:

const u64 a = 1, b = -a; 

// a is now 0x0000000000000001 
// b is now 0xffffffffffffffff 

當然,0xffffffffffffffff(2^64) -1,這是18446744073709551615.

在我看來,那將是更清晰了原來的程序員,而不是寫:

const u64 a = 1, b = ~(u64)0; 

我不是一個C#程序員,但我懷疑下面就爲你工作:

const ulong b = ~(ulong)0; 
+0

我認爲'〜0'依賴於與'-1'相同的未定義行爲(將'int'強制轉換爲'uint64')。 '〜(u64)0'應該解決這個問題。 – 2012-02-08 02:48:51

+0

@Banthar:謝謝,更新:) – 2012-02-08 02:54:39

+0

C中不是UD。標準清楚地定義了將帶符號的負整數轉換爲無符號整數的結果。但我們在這裏甚至沒有。 '1'是帶符號的正數,它被轉換爲無符號(到'a'的類型)而沒有改變。 'a'是無符號的,因爲它被定義爲無符號。 「-a」也是如此。請參閱[此問題和答案](http://stackoverflow.com/q/8026694/968261) – 2012-02-08 02:57:49

0

由於-1作爲無符號類型是不可能的,因此您會得到模糊的調用錯誤(請參見下面的註釋)。你將不得不使用Int64作爲類型(等於long)。

當使用long作爲類型時,結果將是a = 1,b = -1和兩個long。

+0

如果b沒有簽名,b怎麼能是-1?對不起,無法在家中檢查,因爲我只有C#版本的Visual Studio Express。 – RoadWarrior 2012-02-08 02:27:28

+0

如果這是關於C,這裏沒有錯誤,即使在數學上-1不能是非負數。唯一的錯誤可能是程序員不知道他在做什麼。 – 2012-02-08 03:03:23

4

這將是等價的C#:

const ulong a = 1, b = unchecked((ulong)-1); 

或者更簡單地說:

const ulong a = 1, b = 18446744073709551615; 
+0

啊哈 - 非常感謝!所以C代碼實際上導致溢出(在C#中)UInt64.MaxValue? – RoadWarrior 2012-02-08 02:33:11

+0

如果你想要最大值'const ulong b =〜(ulong)0;'也可以工作 – PostMan 2012-02-08 02:36:19

+0

@RoadWarrior - 結果不是由於溢出,只是轉換爲無符號的64位int。詳情請參閱我的回答。 – 2012-02-08 02:37:44

1

C#編譯器會盡力保護您意外negiting一個無符號整數,但可以迫使它這樣的:

ulong a = 1; 
ulong b = (ulong)-(long)a; 

結果將是完全一樣的一羣位的否定有符號整數時,如(即2的補碼),唯一的區別是這些位是如何被解釋爲的

+0

謝謝,這回答了我的另一個問題。 – RoadWarrior 2012-02-08 02:53:36