2013-02-05 52 views
4

這是地道的兩者的互補表示是否與平臺無關?

memset(p, 0, size_of_p); 

,當我們想將它初始化負一,我們可以初始化的內存爲零塊:

memset(p, -1, size_of_p); 

不管是什麼類型的p是,由於兩個的互補表示,對於8位整數,減1是0xff,對於16位,減1,對於32位,0xffffffff。

我擔心的是,這樣的兩個互補表示能否普遍適用於現代計算機領域呢?我可以期待這樣的代碼與平臺無關並且足夠健壯以移植到其他平臺嗎?

在此先感謝。

+0

您的問題標題和您的問題*身體*有關係,但有點相同。你的頭銜似乎要問,按比特的二進制補語是否是普遍相等的(最好是,因爲它只是對比特序列進行一點操作)。但是,您的問題主體屬於負值(特別是'-1')的表示,並且* that *在覆蓋類型的每個字節級別上是否與通用平臺無關。不是這樣。所以你的問題標題的答案是*是*;你的問題主體是* no *。 (正如我讀過的那樣,但我認爲讀代碼可能已經太遲了)。 – WhozCraig

+0

@WhozCraig我改變了主題:D –

回答

4

號,存在由ISO C標準允許代表負數的三種方案:

  • 補;
  • ones'complement;和
  • 符號/大小。

然而,你應該記住,它是一個長期時間,因爲我已經看到了使用兩個不常見的方案的平臺。我會說所有現代實現都使用二進制補碼。

如果您嘗試100%攜帶,您只需要關注這一點。如果您喜歡99.99999%便攜式的人,請不要擔心。


參見info on the ones' complement Unisys 2200(於2010年仍有效)和this answer說明佈局。

+0

在這種情況下,它實際上是一個是的。 :) –

+0

如果我只想初始化一堆數字爲負數(所有有效值都是非負的),那麼看起來您提到的三種方案都適用。我對嗎? –

+0

@Kevin,看到我對100和99.99999%的評論。如果你想要額外的0。00001%覆蓋率,您需要將每個單獨的數組元素設置爲-1。但是你真的想要爲了上部Wherevia中的三臺電腦而花費所有的努力嗎? :-) – paxdiablo

3

簡單的答案是肯定的,但更好的答案是你過早地優化。

寫代碼,而不是你認爲的代碼明顯快:

for(i = 0; i < p; i++) 
    array[i] = -1; 

當p較大將由優化編譯器自動轉換爲可能的最快的表示(在VS它會成爲一個memset的足夠),這就是你想要的,而不必考慮這種過早優化是否總是有效的。

+1

這不是公認的答案,但這是最好的答案。 – xaxxon

相關問題