为什么DWORDLONG mem = 2048 * 1024 * 1024;获取最大值

Why does DWORDLONG mem = 2048 *1024 * 1024; get maximum value?

本文关键字:1024 获取 最大值 2048 DWORDLONG mem 为什么      更新时间:2023-10-16

DWORDLONG在Visual Studio中被定义为ULONGLONG。
乌龙龙的类型定义为__int64。
mem 在调试时会18446744073709551615。
这是DWORDLONG的最大值。
它必须有2147483648。
我的代码有什么问题?

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

2048 * 1024 * 1024中,所有的常量都有类型int,所以乘积被计算为int。如int,乘积是一个有符号算术溢出,理论上未定义的行为,在实践中产生-231。这个数字 -231 是转换为要分配给mem的类型DWORDLONG

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

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

DWORDLONG mem = ((DWORDLONG)2048) * 1024 * 1024;

乘积被计算为 32 位整数,并溢出。将 L 添加到其中一个因子。