DWORDLONG在Visual Studio中的类型定义为ULONGLONG ULONGLONG的类型定义为__int64 当我调试时,mem得到18446744073709551615 它是DWORDLONG的最大值 它必须有2147483648 我的代码出了什么问题?
编辑) DWORDLONG mem = 2048 * 1024 * 1024L有同样的问题。 那么,我该如何解决呢?
答案 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.