为什么是215510*10000!=2155100000

Why is 215510*10000 != 2155100000?

本文关键字:2155100000 10000 215510 为什么      更新时间:2023-10-16

我有以下代码:

UINT64 time1 = 215510*10000;
UINT64 time2 = (UINT64)(215510 * 10000);

当打印它们或在Watch中打印时,结果是:

time1 = 18446744071569684320
time2 = 18446744071569684320

实际上我知道如何在这里制作。为了得到正确的答案,我们必须使用以下代码之一(以下3个版本都可以):

UINT64 time3 = (UINT64)215510 * 10000;
UINT64 time4 = 215510 * (UINT64)10000;
UINT64 time5 = (UINT64)215510 * (UINT64)10000;

但是为什么前两行不能给出正确的答案?

这是因为您通过将两个结果大于32位的32位数字相乘来调用整数溢出。您需要首先转换为64位,正如您已经展示的那样。

因为像215510这样的文字常量在标准C++中通常是int(而不是long)。它与Visual Studio无关(至少在int-s有32位的情况下,它应该与另一个类似GCC的编译器g++相同),因此215510 * 10000也是int。尝试215510L * 10000使一个被乘数为long(因此乘积也是long-如果long-s仍然是32位,它不会改变乘积!),甚至215510LL使其为long long或显式强制转换(int64_t)215510。。。

在您的平台上,int可能是32位。因此,有符号的INT_MAX2147483647(其为231-1)。

Keith Thompson正确地评论道

整数常量的类型是相应列表的第一个其中可以表示其值。

根据(C11标准§6.4.4.1第5项或)C++11标准§2.14.2第2项。因此,在具有16位int-s和32位long-s的实现中,215510long文字常量(因为215510>32767将是其INT_MAX…)

因此,与我所相信的相反,字面积分常数的类型不是由其后缀定义的,也不是由其值定义的

在C++中,非固定整数文字的类型为intlong intlong long int,以最先表示其值的为准。(long long int是该语言的一个相对较新的添加。)

可能在您的系统上,21551010000都属于int类型,可能是32位类型。

表达式(通常)由它们自己评估,而不考虑它们出现的上下文。因此表达式CCD_ 30被评估为CCD_。由于数学结果超过了INT_MAX,所以结果是未定义的,但很可能是-2139867296

当该值被转换为64位无符号类型时,它会环绕,产生18446744071569684320(略小于264)。