看板 C_and_CPP 關於我們 聯絡資訊
問題(Question): 13誡之7有這一段: 錯誤例子: unsigned int a = 0; int b[10]; for(int i = 9 ; i >= a ; i--) { b[i] = 0; } 說明:由於 int 與 unsigned 共同運算的時候,會提升 int 為 unsigned, 因此迴圈條件永遠滿足,與預期行為不符 可是我昨天讀K&R第2版的時候,P43頁寫到: Comparisons between signed and unsigned values are machine-dependent. 不過他舉的例子是long vs. unsigned int 和 long vs. unsigned long 我想問的是 int vs. unsigned int 的情況下是不是一定會把int升級為unsigned int? 感謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 90.41.60.207 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1460730509.A.9C1.html
nowar100: 是 04/15 22:32
wtchen: 請問這是在spec裏面規定的嗎? 04/15 22:34
Caesar08: 查到的都是說,signed會變成unsigned 04/15 22:35
wtchen: K&R裡說,long vs unsigned int的情況unsigned int有可能 04/15 22:36
wtchen: 變成signed long 04/15 22:36
nowar100: unsigned int rank >= int 所以會往 unsigned 轉 04/15 22:37
Schottky: 看來不找一份 spec 出來看不行了... 04/15 22:37
nowar100: 因為 long 和 unsigned int 不一定誰"大" so 不一定 04/15 22:37
nowar100: spec有吧 我記得是promotion rank字眼的 還有 K&R很舊了 04/15 22:38
Schottky: 雖說 ISO 要錢,但前幾天翻到一份 IETF draft 免費的 04/15 22:39
Schottky: 應該只是格式不同,一樣都是講 C89/C90 04/15 22:39
wtchen: C11 spec有701頁,剛丟關鍵字comparison都找沒... 04/15 22:41
nowar100: try google "c integer compare promotion" XD 04/15 22:42
Caesar08: C++ standard n4567, p84, 4.7.2, 4.7.3 04/15 22:43
Caesar08: 這兩個就是你要的 04/15 22:43
wtchen: 找到了,C11 spec P69 04/15 22:44
wtchen: 感謝 04/15 22:44
Caesar08: http://imgur.com/eULXhUn 04/15 22:45
wtchen: 感謝,不過意外看到原來 unsigned char跟signed char 04/15 22:47
wtchen: 等級是一樣的,signed char不會升級成unsigned char 04/15 22:47
wtchen: 而是implementation-defined 04/15 22:48
LPH66: char 有點特別, 因為 char/unsigned char/signed char 04/15 22:50
Caesar08: 好的寫法就是隨時都要注意signed跟unsigned... 04/15 22:50
LPH66: 三者是三個型態, 第一個會跟後兩個其一有同樣的有號性 04/15 22:50
LPH66: 但並沒有規定是哪一個 (這記得是 implementation defined) 04/15 22:51
descent: 感謝分享, 可以把這參考資料加入 13 戒嗎? 04/16 11:36
descent: 沒有官方正式背書, 不是很能確認 13 戒的真實性 04/16 11:37
Caesar08: 13誡有哪條讓你懷疑的? 04/16 12:10
springman: 應該避免寫執行結果是 machine-dependent 的程式碼。 04/16 15:29