Printf Unsigned Long 的奇怪输出
Weird Output for Printf Unsigned Long
这个很简单。
printf("%lu\n", (unsigned long)(320 * 200));
该行代码打印出“4294965760”。这绝对不等于 360 * 200。它有什么问题?
我在 16 位介质内存模型中使用 Digital Mars C 编译器。
我刚刚在我的代码中尝试了这个,我得到了 64000。
也许问题是 320*200
是一个带符号的数字!当你投射它时,他们在位级别上有一些问题吗?尝试
unsigned long x = 320*200;
printf("%lu\n", x);
//64000 = 0b1111101000000000
//4294965760 = 0b11111111111111111111101000000000
看到第一位匹配!所以这可能是演员表的问题。
在 16 位系统上,如果 sizeof(int) == 2
,则 320 * 200
等于 64000
,对于带符号的 int
(范围 ± 32,767——通常也是 -32,768,但理论上它因平台而异)。所以,你有算术溢出。强制转换不影响乘法;它只影响乘法结果。
你会做得更好:
printf("%lu\n", 320UL * 200UL);
强制常量为 unsigned long
。
这个很简单。
printf("%lu\n", (unsigned long)(320 * 200));
该行代码打印出“4294965760”。这绝对不等于 360 * 200。它有什么问题?
我在 16 位介质内存模型中使用 Digital Mars C 编译器。
我刚刚在我的代码中尝试了这个,我得到了 64000。
也许问题是 320*200
是一个带符号的数字!当你投射它时,他们在位级别上有一些问题吗?尝试
unsigned long x = 320*200;
printf("%lu\n", x);
//64000 = 0b1111101000000000
//4294965760 = 0b11111111111111111111101000000000
看到第一位匹配!所以这可能是演员表的问题。
在 16 位系统上,如果 sizeof(int) == 2
,则 320 * 200
等于 64000
,对于带符号的 int
(范围 ± 32,767——通常也是 -32,768,但理论上它因平台而异)。所以,你有算术溢出。强制转换不影响乘法;它只影响乘法结果。
你会做得更好:
printf("%lu\n", 320UL * 200UL);
强制常量为 unsigned long
。