为什么是215510*10000!=2155100000
Why is 215510*10000 != 2155100000?
我有以下代码:
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_MAX
是2147483647
(其为231-1)。
Keith Thompson正确地评论道
整数常量的类型是相应列表的第一个其中可以表示其值。
根据(C11标准§6.4.4.1第5项或)C++11标准§2.14.2第2项。因此,在具有16位int
-s和32位long
-s的实现中,215510
是long
文字常量(因为215510>32767将是其INT_MAX
…)
因此,与我所相信的相反,字面积分常数的类型不是由其后缀定义的,也不是由其值定义的
在C++中,非固定整数文字的类型为int
、long int
或long long int
,以最先表示其值的为准。(long long int
是该语言的一个相对较新的添加。)
可能在您的系统上,215510
和10000
都属于int
类型,可能是32位类型。
表达式(通常)由它们自己评估,而不考虑它们出现的上下文。因此表达式CCD_ 30被评估为CCD_。由于数学结果超过了INT_MAX
,所以结果是未定义的,但很可能是-2139867296
。
当该值被转换为64位无符号类型时,它会环绕,产生18446744071569684320
(略小于264)。
- 回文数在 1 到 10000 之间
- 为什么我的代码无法处理大型数组输入(>10000)?
- 如何读取和处理格式化的日期,如 01/11/1998、星期日(10000 个输入)C++
- 确定数的因数 当除数之和不大于该数时,程序将不接受大于 10000 的限制
- 编写一个程序,该程序在0-99范围内生成10000个随机整数,并从随机数据中产生直方图
- 如何在 1 到 50000 之间对 10000 个数字进行排序
- 如何快速绘制10000 2D图形对象
- 线程:精细10,崩溃10000
- 为什么是215510*10000!=2155100000
- 为什么m_zh=zookeeper_init(m_zkUrl.c_str(),NULL,10000,0,NULL,0)会
- 查找长度高达10000的字符串的子序列
- 矩阵乘法为 10000 X 10000
- 如何在char16_t字符串文本中编码 Unicode 点 U+10000
- 迭代一个有10000行的mysql结果集,耗时3.5秒.这正常吗?
- 添加约10000个密钥后,无序映射中的分割错误