2014-11-04 92 views
2

將已簽名的時候和無符號的值,我們遵循這兩個規則(從https://stackoverflow.com/a/2280810/1073672表達的符號和無符號整數

否則,如果具有無符號整型操作數的秩大於或等於的秩另一個操作數的類型,則帶符號整數類型的操作數將轉換爲具有無符號整數類型的操作數的類型。否則,如果具有有符號整數類型的操作數的類型可以表示具有無符號整數類型的操作數類型的所有值,則將具有無符號整數類型的操作數轉換爲帶有符號的操作數的類型整數類型。

其中上述規則將被觸發:

unsigned int ui = 4; 
ui = ui + 532; 
+0

看看http://stackoverflow.com/a/5563063/4115244! – Blackhat002 2014-11-04 01:38:13

+0

http://stackoverflow.com/questions/21627665/implicit-conversion-confusion-between-signed-and-unsigned-when-reading-kr-book看看@這 – 2014-11-04 04:15:09

回答

2

類型不斷532的是int,這是簽署。

看看第一條規則,由於unsigned intint具有相同的等級,所以無符號類型的等級大於或等於有符號類型的等級。第一條規則匹配。在添加之前,簽署的532轉換爲unsigned int

即使第一條規則不匹配,添加也不能匹配第二條規則,因爲有符號的int不能代表unsigned int的所有值。 (有相同數量的可能的簽名int S作爲unsigned int S,但是,例如,-1是簽名int但不是一個unsigned int,因此必須有至少一個unsigned int不能被表示爲帶符號int。)

+0

@MattMcNabb謝謝,改變它。 – 2014-11-04 12:39:02

+1

符合的實現*可以*將int的範圍作爲'unsigned int'範圍的一個子集。 'int'的符號位必須是'unsigned int'的填充位。對於只有硬件支持有符號整數的系統來說,這可能是合理的。 (我知道現實生活中沒有這樣的現有系統。) – 2014-11-04 17:02:49

相關問題