推 LPH66: 這裡其實還牽扯到一個細節是 C/C++ 沒有負的 literal 06/08 15:45
→ LPH66: 所以直接寫 -2147483648 基本上是行不通的 06/08 15:45
嗯 沒錯 我再編輯補充一下 www
→ LPH66: 我好一陣子前寫了一個小題目來講解這回事: 06/08 15:52
推 wtchen: 我這邊列的INT_MIN/INT_MAX是Standard制定的 06/08 16:38
哪一份的 Standard 定義 INT_MIN 是 -2147483647 了?
→ wtchen: 當然OS實作或user define可以有別的方法 06/08 16:38
還有 INT_MIN 定義跟 OS 實作有什麼關係?是編譯器標頭檔實作。
還有置底的 C/C++ 語言新手十三誡有很多用詞沒有很精確的地方。
推 wtchen: 一般linux會做成#define INT_MIN (-INT_MAX - 1) 06/08 16:48
→ wtchen: 稍微改了一下.... 06/08 16:51
→ wtchen: 看看有沒有好些.... 06/08 17:23
推 yvb: 如果你去看C99/C11 Standard,你會發現long int (4 bytes)... 06/08 21:53
→ yvb: INT_MIN... 06/08 21:53
→ yvb: 為何我看到的, long int 應該是對應 LONG_MIN 和 LONG_MAX ? 06/08 21:54
→ yvb: 然後 int 才是對應 INT_MIN 和 INT_MAX ... @@ 06/08 21:55
→ yvb: 如果 ... "long int" <== 原文 488 行. 06/08 22:08
→ yvb: 然後C99/C11中, INT_MIN/INT_MAX 的 "範例" 是 -32767/+32767 06/08 22:13
好神奇... http://www.cplusplus.com/reference/climits/
就是保證 int 至少有 2 bytes 那麼大,而不是 4 bytes...
※ 編輯: Hazukashiine (140.113.68.118), 06/08/2016 22:19:08
推 wtchen: 一開始我也發現這點,所以如果有人更早看到我的更新會發現 06/08 22:21
推 wtchen: 我一開始是用short作例子(因為int有int跟long int兩種) 06/08 22:22
→ wtchen: 不過short好像不存在abs,所以才改用int(汗) 06/08 22:22
→ wtchen: 我還是把例子改成long好了(汗) 06/08 22:25
→ wtchen: 不過long有一樣的問題,64bit是8byte 06/08 22:26
推 wtchen: 改成long了,這次應該好多了 06/08 22:31
推 wtchen: 用字我也想儘量精準,所以有任何意見請不吝指正 06/08 22:37
嗯嗯 看起來蠻認真編輯的 晚一點再指出是哪邊吧 QQ
※ 編輯: Hazukashiine (140.113.68.118), 06/08/2016 22:58:56
推 yvb: 嗯. C99/C11 的 5.2.4.2.1 提到是 implementation-defined, 06/08 23:11
→ yvb: 而數值的絕對值要大於等於該值(比方INT_MAX不可小於+32767). 06/08 23:12
推 wtchen: Standard給的都是"範圍至少要怎樣",編譯器實作只要比較大 06/08 23:24
→ wtchen: 就OK(我有特別註明) 06/08 23:25
→ wtchen: 但是因為範圍不對稱(差1的情況下)造成像abs這樣突然超過 06/08 23:25
→ wtchen: 範圍的情況下會出現啥就是未定義 06/08 23:26
推 yvb: 嗯, 因為提到 standard, 就應該照抄, 不能亂改數值 :P 06/08 23:32
→ yvb: 另外, (4 bytes) 也許可以改移到備註, 說明在多數 16-bits 06/08 23:32
→ yvb: 和 32-bits 編譯器可能採用; 而 64-bits 可能不同之類. 06/08 23:33
→ wtchen: 因為我手上只有Linux-64bit,Win我不熟不知道狀況是否不同 06/08 23:34
→ wtchen: 16bit...我多久沒用了.... 06/08 23:35
→ wtchen: 把16/32/64bit的可能情形加進去了 06/08 23:40
→ wtchen: 各位教訓的是.... 06/09 01:08