這個程式碼有什麼問題呢?
組合語言之前沒有秘密, 翻成組合語言大概如下:
il.s L18 705032704 是怎麼來的, 5000000000 怎麼不見了, 5000000000=0x12A05F200
705032704 = 0x 2A05F200
有點感覺了嗎?
5000000000 超過 unsigned int (4 byte) 的大小, gcc 只留下了右邊 4 byte, 這是 undefined 行為, gcc 是如此處理 overflow。
再來是 il.c L7 的 signed int 和 unsigned int 的比較會提升為 unsigned int 和 unsigned int 的比較, 從 il.s L31 也可看出。
JB Jump if below unsigned
ref:
http://www.unixwiz.net/techtips/x86-jumps.html
jb 是以 unsigned 的方式來比較兩個數字。
0xffffffff = 4294967295
0x7fffffff = 2147483647
沒有留言:
張貼留言
使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。
我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。