2013-04-24 48 views
9

通常已知值是正值。例如,TCP/UDP序列號總是正值。 intunsigned int都足以存儲最大的sequence number,所以我可以使用這些類型中的任何一種。還有很多其他的例子,值已知是積極的。每次我知道我正在處理無符號值時,我應該使用「無符號」嗎?

是否有任何理由使用unsigned類型時,常規signed類型的容量是否足夠(通常綽綽有餘)?

我個人傾向於使用常規的類型,因爲:

  • int可能是一個有點更具可讀性比uintunsigned int
  • 我並不需要包括額外的頭爲UINT
  • 我將避免在程序中的其他地方進一步投入

使用原因unsigned類型我可以想象:

  • 幫助編譯器生成更好的代碼?
  • 幫助其他程序員理解變量是無符號
  • 避免可能出現的錯誤(例如,當INT被分配到UINT編譯器可能會產生編譯時錯誤,我們應該檢查我們分配一個值不爲負)
+0

有關此處的一些想法:http://embeddedgurus.com/stack-overflow/2009/08/a-tutorial-on- signed-and-unsigned-integers/ – Morwenn 2013-04-24 09:36:57

+1

謝謝,我剛纔發現這個問題http://stackoverflow.com/questions/12225521/should-unsigned-ints-be-used-if-not-necessary?rq= 1 – javapowered 2013-04-24 09:38:02

+1

沒有。有一些反對使用'unsigned'的爭論 - Stroustrup在某處傳遞了C++編程語言 - 拉科斯在他的一本書中寫了一篇關於它的章節:單調乏味。示例問題:如果你有值a和b,'abs(a - b)'傾向於直觀地用於整數,但不是無符號的;值得注意的是標準轉換可以默默啓動,所以您可能希望從無符號使用中獲得的支票無論如何都不起作用 - 負值變得無聲無息,反之亦然。 – 2013-04-24 09:39:16

回答

1

一個原因是,比較有符號和無符號數字可能會導致令人驚訝的結果。在C和(我認爲)C++中,比較有符號和無符號數將導致有符號數被解釋爲無符號數。如果帶符號的值恰好是負值,則將其讀爲無符號將給出比任何無符號數更大的值,這不是您想要的值。有關Objective-C中的示例,請參見this question,它使用與C相同的轉換規則。