作者littleshan (我要加入劍道社!)
看板C_and_CPP
標題Re: [分享] 問題導向的 學習方式
時間Mon Jun 24 20:11:42 2013
※ 引述《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