我是否正確地說有符號和無符號整數之間的區別是: 編程
還有其餘差別嗎? 安全
在嵌入式系統上編程時,必須使用無符號整數。 在循環中,當不須要有符號整數時,使用無符號整數將節省設計此類系統所必需的安全性。 ui
C中的有符號整數表示數字。 若是a
和b
是有符號整數類型的變量,該標準將永遠不須要編譯器,這樣使得表達式a+=b
店,變成a
比它們各自的值的算術和其餘任何東西。 能夠確定的是,若是算術總和不適合a
,處理器可能沒法將其放在那裏,但標準不須要編譯器截斷或包裝值,或者作任何其餘事情,若是值爲超過其類型的限制。 請注意,雖然標準不要求它,但容許C實現使用有符號值捕獲算術溢出。 spa
C中的無符號整數表現爲整數的抽象代數環,除了涉及對較大類型的轉換或操做的場景外,它們是2的冪的一致模。 將任意大小的整數轉換爲32位無符號類型將產生對應於與整數mod 4,294,967,296一致的事物的成員。 從2中減去3獲得4,294,967,295的緣由是,將一些與3一致的東西添加到與4,294,967,295一致的東西將產生與2一致的東西。 設計
抽象代數環類型一般是方便的東西; 不幸的是,C使用簽名做爲一個類型是否應該表現爲環的決定因素。 更糟糕的是,無符號值在轉換爲較大類型時被視爲數字而不是環成員,而小於int
無符號值在對它們執行任何算術時將轉換爲數字。 若是v
是uint32_t
,等於4,294,967,294
,那麼v*=v;
應該使v=4
。 不幸的是,若是int
是64位,那麼就不知道v*=v;
能作。 code
鑑於標準自己,我建議在須要與代數環相關聯的行爲的狀況下使用無符號類型,並在想要表示數字時使用簽名類型。 不幸的是,C以它的方式繪製了區別,但它們就是它們的本質。 編譯器
他只詢問簽名和未簽名。 不知道爲何人們會在這裏添加額外的東西。 讓我告訴你答案。 編譯
無符號:它僅包含非負值,即0到255。 變量
簽名:它包含負值和正值,但格式不一樣 循環
這個解釋是關於8位數字系統。
通常來講這是正確的。 在不知道爲何要尋找差別的狀況下,我沒法想到簽名和未簽名之間的任何其餘區別。