为什么DWORDLONG mem = 2048 * 1024 * 1024;获得最大价值?

时间:2016-01-27 04:39:08

标签: c++

DWORDLONG在Visual Studio中的类型定义为ULONGLONG ULONGLONG的类型定义为__int64 当我调试时,mem得到18446744073709551615 它是DWORDLONG的最大值 它必须有2147483648 我的代码出了什么问题?

编辑) DWORDLONG mem = 2048 * 1024 * 1024L有同样的问题。 那么,我该如何解决呢?

2 个答案:

答案 0 :(得分:2)

2048 * 1024 * 1024中,所有常量都有int类型,因此产品计算为int。作为int,产品在理论上是一个带符号的算术溢出,未定义的行为,并且在实践中产生-2 31 。这个数字-2 31 是转换为DWORDLONG类型的{@ 1}}。

目标类型是64位无符号类型,因此(相对较小)幅度的负值将转换为接近该类型最大值的值。与转换为mem时-1相同的方式产生值2 64 -1时,值-2 ​​ 31 转换为DWORDLONG产生值2 64 -2 31

您可以通过将第一个操作数转换为DWORDLONG来确保整个操作链在DWORDLONG中完成,从而产生正确的结果:

DWORDLONG

答案 1 :(得分:1)

产品被评估为32位整数,并溢出。在其中一个因素中添加L.