作者Feis (永遠睡不著 @@)
看板C_and_CPP
標題Re: [問題] 關於long和unsigned long
時間Thu Dec 26 20:55:17 2013
※ 引述《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