[問題] C unsigned long的問題

作者: final01 (牛頓運動定律)   2017-07-17 22:35:12
開發平台(Platform): (Ex: Win10, Linux, ...)
Linux
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
GCC
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
問題(Question):
#include <stdio.h>
void print_x(unsigned long x)
{
printf("=> 0x%lx\n",x);
}
int main()
{
print_x(0x80000000);
print_x((1<<31));
}
想問為何同樣是數字一個不會overflow 一個會??
餵入的資料(Input):
0x80000000
1<<31
最近看到別人寫的code都會用1UL << 31應該也是怕overflow ??
預期的正確結果(Expected Output):
=> 0x80000000
=> 0x80000000
錯誤結果(Wrong Output):
=> 0x80000000
=> 0xffffffff80000000
程式碼(Code):(請善用置底文網頁, 記得排版)
補充說明(Supplement):
作者: JFLung9536 (立月小蛇)   2017-07-17 23:11:00
第二個拆成兩行做
作者: LPH66 (-6.2598534e+18f)   2017-07-18 00:04:00
因為你單寫 1 的型態是 int, 寫 1UL 才是 unsigned long0x80000000 則比較有趣, int 裝不下, 它變成 unsigned int
作者: Qbsuran (Qbsuran)   2017-07-18 01:54:00
overflow是當一組byte要解析成sigined或unsigned才會發生

Links booklink

Contact Us: admin [ a t ] ucptt.com