本主題在很多情況下都經過了深入討論。當我搜索並閱讀一些帖子時。後來發帖讓我很困惑。關於整數推廣的問題仍然存在問題,C中的轉換問題
Signed to unsigned conversion in C - is it always safe?
以下是原來的問題。
unsigned int u = 1234;
int i = -5678;
unsigned int result = u + i;
答案簡單地引用了「6.3.1.8通常的算術轉換」第3點,即
否則,如果具有無符號整數類型的操作數的秩大於或等於的秩另一個操作數的類型,則帶符號整數類型的操作數將轉換爲具有無符號整數類型的操作數的類型。
但是,如果我的理解是正確的,整數推廣應考慮「通常的算術轉換」以前做過。
而規則是
如果int可以表示原始類型的所有值,該值被轉換爲int。否則,它被轉換爲一個無符號整數。這些轉換規則被稱爲積分促銷
所以,這意味着除了完成與類型的符號整數比unsigned int類型。如果將負值分配給unsigned int結果,則轉換爲較大值。
我對自己的理解有點不自信。有沒有人對這個帖子有類似的困惑?
歡迎任何回覆或評論。感謝提前!
傑夫
看來我對上面的帖子中的第二條規則有點誤解。我的理解是int可以表示u的值,所以,應該將u提升爲int,而不是* unsigned int *。這是錯的嗎? – Poor
@第一步是整數升級,這裏升級的操作數在升級之前和之後是相同類型的。在第二步中,C說(在c99中,6.3.1.8p1)*「如果具有無符號整數類型的操作數的秩大於或等於另一個操作數類型的秩,那麼具有有符號整數類型的操作數是轉換爲具有無符號整數類型的操作數的類型「*和'unsigned int'和'int'類型的轉換等級相同。這就是爲什麼'i'在第二步轉換爲'unsigned int'的原因。 – ouah
@Poor對你更清楚嗎? – ouah