看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《sjgau (sjgau)》之銘言: : ※ 引述《sjgau (sjgau)》之銘言: : : 已經會的人,看看就好。不需要回應 : : 不會的人,可以參與討論。也可以私下討論 : 上面的這兩句話,很多人看不懂 因為你分享的是錯誤觀念 如果你講得夠正確夠完整 我想這個板一直很歡迎大家分享 : : int a, b, t1, t2; : : a= 10; : : b= a + 1;// b > a : : t1 =time(NULL); : : while (b > a) { : : a++; : : b= a + 1; : : } : : // b <= a, why??? : overflow 是原因, : 但是,+2147483647 + 1 --> 為何會變成 : -2147483648, 並沒有解釋清楚 : 所謂的 XX, XX 是 : 必須解釋 1's 補數, 2's 補數 C 規定 overflow 的結果為 undefined behavior 除了因為 interger type 不一定使用 2's complement 還有一個重要理由,那就是允許 compiler 做一些超乎想像的最佳化 姑且先退一萬步 我就拿我家裡的 GCC 4.7 on Linux x86_64 來舉例好了 在這平台上 int 是 32bit 沒有 padding 而且使用 2's complement 這應該算是非常普遍大家熟到不能再熟的環境了 然後上面那個 while 迴圈經過 -O3 最佳化後 你知道變成什麼指令嗎? 結果是這樣: .L2: jmp .L2 是的,就是一個無窮迴圈 因為 compiler 發現在不造成 overflow 的情況下 b 永遠比 a 大 所以直接代換成無窮迴圈 而這是正確的 compiler 行為,因為 overflow 的結果為未定義 因此產生無窮迴圈也是標準允許的結果 如果你沒有教導初學者這件事 那就是在陷害他們 讓他們以後打開 -O3 的時候遇到難以理解的 bug : : t2= time(NULL); : : // print a, b, (b > a) : : // print (t2 - t1) : : 在數學上,(a + 1) 永遠 大於 a : : 所以, 上面的 while, 會是一個 無窮迴圈, : : 但是, 上面的迴圈,大概 七秒鐘左右就會結束, : : 出來的 a, b 的答案是多少? why??? : : 如果想要讓時間的計算能夠更精確, : : 該如何處理? : : sjgau4311@gmail.com : clock() 是可以,但是 不夠好 : 比較好的是 ftime() http://linux.die.net/man/3/ftime This function is obsolete. Don't use it. If the time in seconds suffices, time(2) can be used; gettimeofday(2) gives microseconds; clock_gettime(2) gives nanoseconds but is not as widely available. : 當你的心中充滿垃圾,你看到的別人就是 垃圾, : 當你的心中充滿聖靈,你看到的別人都是 佛陀。 : 願大家都是 佛陀 小學而大遺,吾未見其明也。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.135.3.139
TsinTa:推,我覺得這才是正確的觀念。 06/24 20:16
azureblaze:其實我還滿好奇int overflow有什麼實務上的用法 06/24 20:16
azureblaze:一般要爆數值都用unsigned,沒有overflow的問題 06/24 20:16
TsinTa:不要用來毀滅宇宙就好了XD 06/24 20:17
azureblaze:在我的概念中int overflow就是程式出bug了 06/24 20:17
cuteclare:推! 06/24 20:23
legendmtg:推 06/24 20:27
tjjh89017:overflow都是在wargame中遇到吧xD 06/24 20:39
MOONRAKER:讚。 06/24 20:50
coolcomm:推... 06/24 21:05
k1400:打的好 06/24 21:18
sa074463:推 06/24 21:51
mabinogi805:推 06/24 21:53
maerdimer:推!!! 06/24 23:39
dazmin:佩服推! 06/25 02:36
yoco315:唉,sjgau 真的是少數「熱心有餘,能力不足」的好人 06/25 02:52
yoco315:以前看漫畫,有一種人是超愛幫助人,但被幫助的都會倒楣... 06/25 02:52
yoco315:我覺得 s 版友應該是這種漫畫人物的具現體吧.. 06/25 02:53
lc85301:好猛喔lol 06/25 03:15
incoming:前一篇內容是什麼, 沒跟到 06/25 08:20
leiyan:overflow就單純最高位元進位捨棄而已 06/25 09:21
CaptainH: 06/25 12:27
zhouer:我的 gcc 4.6.3, Linux 3.2 x86, 用 -O2 就得到無窮迴圈了 06/25 14:29
chunhsiang:推高手分享知識 06/25 15:13
xxxx9659:此篇正解 詳情請看原PO寫的 "C 語言常見誤解" 好看!!! 06/26 05:42
kikiqqp:其實寫asm還蠻常利用overflow的...所以很多技巧在C上就被 06/26 11:00
kikiqqp:編譯器最佳化幹掉了而出現bug 06/26 11:01
VictorTom:推:) 06/27 02:42
linccg:推 06/27 11:41
firejox:推 06/27 23:53
DigiPrince:大推! 06/30 18:23
kkc:推~ 07/02 01:52
softwind:朝聖! 很多人喜歡用經驗法則來講解 但實際上很多是未定義 07/12 19:23
softwind:的行為 只是你 碰巧矇到而已... 07/12 19:23