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