【发布时间】:2012-08-09 12:01:38
【问题描述】:
我有一个奇怪的错误/错误/自我愚蠢问题。我正在用 C 语言开发一个小型应用程序,并且正在使用 Visual Studio 2010 SP1。违规代码:
uint64_t sum_squared_X = 65535*65535*64;
int64_t sum_squared_Y = 65535*65535*64;
调试时,我得到以下结果:
sum_squared_X = 18446744073701163072;
sum_squared_Y = -8388544;
问题是,为什么? uint64_t 的最大值为 2^64-1 或 18446744073709551615,int64_t 的最大值为 2^63-1 或 9223372036854775807。
65535*65535*64 = 274869518400,低于两个最大值。那我为什么会得到这些结果?
我完全迷路了,不胜感激。
【问题讨论】:
-
从第一个结果来看,它显示为您的乘法
65535*65535*64返回值18446744073701163072...这解释了为什么第二个结果为负,但不是如何... -
如果你尝试
uint64_t sum_squared_X = 65535; sum_squared_X *= 65535; sum_squared_x *= 64,你会得到同样的结果吗? -
其他可能性:你说“调试时我得到这些结果”,你是如何得到它们的?您确定以正确的方式打印它们吗?
-
65536的类型是int,不是int64_t。所以你得到一个 int 乘法,它会溢出。请改用 65536LL。
-
Eregrith,Visual Studio 在其 GUI 中显示变量的值,无需打印 :)
标签: c++ c visual-studio int64 uint64