Re: C/C++ 語言新手十三誡 -- Ver. 2016

作者: Hazukashiine (私は幸せです)   2016-06-08 15:37:35
※ 引述《wtchen (沒有存在感的人)》之銘言:
:
: INT_MIN -2147483647 // compiler實作時最小值不可大於 -(2147483648-1)
: ^ ^^^^^^^^^^^^ ^^^^^^^^^^^^^^
: INT_MAX 2147483647 // compiler實作時最小值不可小於 (2147483648-1)
: ^^^^^^^^^^^^ ^^^^^^^^^^^^^^
: 不過由於32bit能顯示的範圍就是2**32種,所以一般作業系統會把
: ^^^^^^^ ^^^^^^^^^^^^^^^^^^^^
: INT_MIN多減去1,也就是int 的顯示範圍為-2147483648 ~ +2147483647。
: 當程式跑到abs(-2147483648)>0時,由於int不存在2147483648,
: 於是正確結果無法被有限的數位顯示(undefined behavior) 解釋奇怪的地方
:         ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^
不知道這樣有沒有比較好:
  INT_MIN = -2147483648
  INT_MAX = 2147483647
  由於 integer literal 會被視為 int 整數型態
  所以 #define INT_MIN -2147483648 是行不通的(超過 int 上界)
  因此編譯器標頭檔實作時可以定義成 #define INT_MIN (-INT_MAX - 1)
作者: LPH66 (-6.2598534e+18f)   2016-06-08 15:45:00
這裡其實還牽扯到一個細節是 C/C++ 沒有負的 literal所以直接寫 -2147483648 基本上是行不通的我好一陣子前寫了一個小題目來講解這回事:https://paste.plurk.com/show/2283249/
作者: wtchen (沒有存在感的人)   2016-06-08 16:38:00
我這邊列的INT_MIN/INT_MAX是Standard制定的當然OS實作或user define可以有別的方法一般linux會做成#define INT_MIN (-INT_MAX - 1)稍微改了一下....看看有沒有好些....
作者: yvb   2016-06-08 21:53:00
如果你去看C99/C11 Standard,你會發現long int (4 bytes)...INT_MIN...為何我看到的, long int 應該是對應 LONG_MIN 和 LONG_MAX ?然後 int 才是對應 INT_MIN 和 INT_MAX ... @@如果 ... "long int" <== 原文 488 行.然後C99/C11中, INT_MIN/INT_MAX 的 "範例" 是 -32767/+32767
作者: wtchen (沒有存在感的人)   2016-06-08 22:21:00
一開始我也發現這點,所以如果有人更早看到我的更新會發現我一開始是用short作例子(因為int有int跟long int兩種)不過short好像不存在abs,所以才改用int(汗)我還是把例子改成long好了(汗)不過long有一樣的問題,64bit是8byte改成long了,這次應該好多了用字我也想儘量精準,所以有任何意見請不吝指正
作者: yvb   2016-06-08 23:11:00
嗯. C99/C11 的 5.2.4.2.1 提到是 implementation-defined,而數值的絕對值要大於等於該值(比方INT_MAX不可小於+32767).
作者: wtchen (沒有存在感的人)   2016-06-08 23:24:00
Standard給的都是"範圍至少要怎樣",編譯器實作只要比較大就OK(我有特別註明)但是因為範圍不對稱(差1的情況下)造成像abs這樣突然超過範圍的情況下會出現啥就是未定義
作者: yvb   2016-06-08 23:32:00
嗯, 因為提到 standard, 就應該照抄, 不能亂改數值 :P另外, (4 bytes) 也許可以改移到備註, 說明在多數 16-bits和 32-bits 編譯器可能採用; 而 64-bits 可能不同之類.
作者: wtchen (沒有存在感的人)   2016-06-08 23:34:00
因為我手上只有Linux-64bit,Win我不熟不知道狀況是否不同16bit...我多久沒用了....把16/32/64bit的可能情形加進去了各位教訓的是....

Links booklink

Contact Us: admin [ a t ] ucptt.com