作者BillSky (比爾蓋天)
看板C_and_CPP
標題Re: [問題] 我自學C++ 接下來我該怎麼走
時間Tue Feb 16 22:36:37 2010
※ 引述《ale34354 (雞屎)》之銘言:
: 1.
: 答案顯示不出來因為超出範圍long int的範圍是-2147483648-2147483647
: 這個乘以後是2400000000
: 問一下 40000L "L"是什麼意思 我不知道 所以我就假設他是40000
既然原po已經回答了,我也想說明一下為什麼我主張改成unsigned會比較好。
我的推文寫到即使題目改成unsigned,也可以更改變數值到超過能表述的範圍。
此時詢問學生"為什麼?"的意義會和signed一樣甚或更好。
根據C++ Primer 4/e侯捷老師所翻譯的中文本p.37,
在同樣超出能表述範圍的情況下,
unsigned的結果是該數值除以所能表述的最大值的餘數,
而signed的結果則是由編譯器決定。
有時我們習慣使用自己慣用的編譯器來編譯執行,再看結果是什麼,
卻很容易忽略像是未定義行為,或編譯器有權決定等等的因素會影響答案。
當然出題者是要問"為什麼?",而不只是要一個數值,
但我以為同時有signed和unsigned對照在這題會比較完整。
另外,在版上有看到推文建議原po應該閱讀的書籍。
如果不講求速效的話,C++ Primer遲早還是要看的。
然而,
讀英文版英文要好;讀中文版中文要好,
這不管在那一本書的那一種版本都適用。
比爾蓋天
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.32.177.97
推 sjgau:我是想要表達 2's 補數,如何表示 負的整數的 想法 02/16 22:47
→ sjgau:所以,才這樣子出題目的。計算機概論 一定會討論到 02/16 22:48
推 zerodevil:拿undefined behavior來考人總是不太好.. 02/17 02:48
→ zerodevil:除非你真的是想考他知不知道undefined behavior 02/17 02:48
推 sjgau:在K&R裡面,page 2-3 有提到,signed 型別,使用 2's 補數 02/17 06:22
→ sjgau:的表示法,所以並不是 未定義行為。我使用 Fortran, LISP 02/17 06:23
→ sjgau:都得到相同的結果。所以 應該沒問題。就是 這樣。 02/17 06:24
推 sjgau:你可以告訴我,哪裡有提到這是 未定義的行為嗎? 02/17 06:29
→ BillSky:pdf 請接網址然後查"integer overflow"或"overflow" 02/17 06:45
→ BillSky:是standard的pdf,不是惡意連結,請放心。 02/17 06:45
推 VictorTom:那個~~signed使用2's補數表示法儲存, 與signed型態遇到 02/18 22:34
→ VictorTom:overflow時的處理方式是兩件事喔, 我想BS大是這個意思:) 02/18 22:34