看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) dev c++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): printf("%lu,%lu,%lu\n",jj[k-1],k,k); 前面的k跟後面的k竟然值不同 而且前面的k固定值是0 神秘的是,使用64bit的compiler就會成為相同的值了 餵入的資料(Input): 1 3 預期的正確結果(Expected Output): 至少k要一致吧 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) http://ideone.com/kKFOvS 補充說明(Supplement): QQ完全不知道從哪裡出現問題 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.113.65.19 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1412873125.A.E4D.html
suhorng: jj 跟 k 又不是 unsigned long, 怎麼會用 %lu 10/10 01:09
suhorng: 編譯開個 -Wformat 讓 compiler 告訴你 10/10 01:10
bjiyxo: unsigned long跟unsigned int不是都是4B嗎?不能混用嗎QQ 10/10 01:22
bjiyxo: 不過即使使用%u也還是沒有改變結果? 10/10 01:27
lantw44: scanf 的 i 和 j 也要改成 %u 10/10 01:42
lantw44: 我這裡執行如果 scanf 沒改程式直接 crash 10/10 01:43
lantw44: unsigned long 和 unsigned int 不保證一樣大 10/10 01:44
lantw44: 也不保證是幾個 bytes 10/10 01:44
scwg: 樓上幾位都指出是 format string 錯了, 其中造成前面的 k 固 10/10 01:52
scwg: 定是 0 的原因是第一個 %lu: jj[k-1] 是 long long 所以不能 10/10 01:52
scwg: 用 %lu, 要用 "%llu". 32bit compiler 會把 jj[k-1]的8bytes 10/10 01:53
scwg: 放進stack, %lu 拿前 4 bytes, 第二個 %lu 拿後 4 bytes, 10/10 01:54
scwg: 因此該印出 k 的第二個 %lu 印出的是 jj[k-1] 的後 4 bytes 10/10 01:54
bjiyxo: 原來如此! 學到了! 非常感謝scwg大! 10/10 01:55
purincess: 請google LLP64, LP64, 會有更詳細的說明 XD 10/10 13:25
uranusjr: LPH66 表示: 10/10 14:42
LPH66: (探頭 10/10 16:27
EdisonX: 我笑了 10/10 20:44
purincess: 嗨LPH (揮手 10/11 00:34
carylorrk: 嗨 LPH66,今天下午打球,球你帶(誤 10/11 13:55
BlazarArc: XDDD 10/14 16:50
CP64: XDDDD 10/14 18:18