[問題] 關於八進制的一個奇怪的問題.

看板C_and_CPP (C/C++)作者 (魯塞)時間13年前 (2013/01/10 17:58), 編輯推噓0(0013)
留言13則, 3人參與, 最新討論串1/2 (看更多)
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) MinGW - GCC (32 bits) 問題(Question): 面試出題時,查大陸題庫書籍,發現解答不正確, 程式碼是用%o輸出, 但大陸書籍的解答應該是用%d作輸出, 就算用%d輸出,答案也不正確. 實際操作後,有兩個問題: 1.不知道編譯器是怎麼計算這些八進制的程式語法? 想請問輸入後的八進制算法是? (C language) 2.已經知道此語法產生了溢位,但不知數字是怎麼產生出來的? 語法分析和原理為何? 餵入的資料(Input): '\1' '\11' '\111' '\1111' '\11111' '\111111' '\1111111' '\11111111' '\111111111' ... 預期的正確結果(Expected Output): %d 的輸出結果: 1 9 73 18737 4796721 1227960625 825307441 825307441 825307441 %o 的輸出結果: 1 11 111 44461 22230461 11114230461 6114230461 6114230461 6114230461 ... 錯誤結果(Wrong Output): 大陸書籍的解答: 1 9 73 585 4681 37449 299593 2396745 19173961 ... 程式碼(Code):(請善用置底文網頁, 記得排版) printf ("%o\n",'\1'); printf ("%o\n",'\11'); printf ("%o\n",'\111'); printf ("%o\n",'\1111'); printf ("%o\n",'\11111'); printf ("%o\n",'\111111'); printf ("%o\n",'\1111111'); printf ("%o\n",'\11111111'); printf ("%o\n",'\111111111'); 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc)

01/10 18:18, , 1F
C99 6.4.4.4p10: 超過1byte的char literal
01/10 18:18, 1F

01/10 18:19, , 2F
他的值是implementation-defined
01/10 18:19, 2F

01/10 18:19, , 3F
也就是說compiler爽就好
01/10 18:19, 3F

01/10 18:22, , 4F
和上面的i+++++i一樣寫這種code的人應該被推下樓梯
01/10 18:22, 4F

01/10 18:35, , 5F
噗,八進位整數是0111,不是'\111'
01/10 18:35, 5F

01/10 18:36, , 6F
這個共匪書實在太好笑了 趕快告訴大家書名 當大爆笑收藏
01/10 18:36, 6F

01/10 18:39, , 7F
給樓上 他是八進位字元所以'\111'是合法的
01/10 18:39, 7F

01/10 18:52, , 8F
看到是%o的時候,想了一下子... 發覺這題很難,特別是算法
01/10 18:52, 8F

01/10 18:53, , 9F
他用%o是預期八進位整數 不是八進位字元 你看也知道
01/10 18:53, 9F

01/10 18:54, , 10F
還要想是哪個compiler,短時間很難回答出來.
01/10 18:54, 10F

01/10 18:54, , 11F
這題目不叫難叫做爛...
01/10 18:54, 11F

01/10 18:54, , 12F
這個題目完全扭曲了 真是一個大爆笑等級的題目
01/10 18:54, 12F

01/10 18:59, , 13F
回各位大大,補上%o的結果.
01/10 18:59, 13F
※ 編輯: ruthertw 來自: 36.224.221.178 (01/10 19:39)
文章代碼(AID): #1Gxf3PQ1 (C_and_CPP)
文章代碼(AID): #1Gxf3PQ1 (C_and_CPP)