看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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