看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《roger29 (=======中間選民=======)》之銘言: : 各位先進好 : 最近看K & R的The C programming language(ed 2) : 在p.44的地方有講到關於unsigned operands的conversion rule : 書上舉了一個例子 : 假設int是16 bits long是32bits : 那麼-1L < 1U 且 -1L > 1UL : 書上說 -1L is promoted to unsigned long and thus appears to be a large : positive number : 實在是不太懂為何? 有人可以解釋一下為什麼 -1L會變成很大的正整數嗎? : 謝謝 照 C89 3.2.1.2 章節所述, 當有號整數轉為無號整數, 且 sizeof(有號整數) <= sizeof(無號整數), 且 該有號整數的值為負數時, 該有號整數會被加上該無號整數型態的最大值再加 1 的值 -- 補充細節: [-1L 與 1U 的大小比較] -1L 為 long int 1U 為 unsigned int 照題意 long 是 32bits 且 int 是 16bits, 所以 sizeof(long int) > sizeof(unsigned int) 比較大小時, 因為 long int 可以表示 1, 所以 1U 會被轉型提昇成 long int 也就是 1L 最後因為 -1L < 1L 所以 -1L < 1U [-1L 與 1UL 的大小比較] -1L 為 long int 1UL 為 unsigned long int sizeof(long int) == sizeof(unsigned long int) 比較大小時 -1L 會被轉型換號成 unsigned long int 因為該值為負數, 所以轉有號數時套用一開始提到的規則, 該值會變成 -1 + (ULONG_MAX + 1) 即 ULONG_MAX 因為 ULONG_MAX > 1UL 所以 -1L > 1UL -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.29.148 ※ 編輯: Feis 來自: 140.112.29.148 (12/26 21:23)
BombCat:推 讀過都忘了 XD 12/26 21:32
roger29:感激不盡 我明瞭了@@ 12/26 22:20