这个问题可能很愚蠢或偏执,但无论如何:-)。给定以下代码:
DWORD hiRes;
// will overflow about once in an hour
hiRes = GetTickCount() * 1193L;
如果它知道hiRes
周期性溢出并且这种情况得到妥善处理,那么这段代码有什么问题吗?
更新:
结果对我来说非常令人惊讶,因为答案取决于hiRes
C 标准定义的(有符号或无符号)类型(参见示例)。
这个问题可能很愚蠢或偏执,但无论如何:-)。给定以下代码:
DWORD hiRes;
// will overflow about once in an hour
hiRes = GetTickCount() * 1193L;
如果它知道hiRes
周期性溢出并且这种情况得到妥善处理,那么这段代码有什么问题吗?
更新:
结果对我来说非常令人惊讶,因为答案取决于hiRes
C 标准定义的(有符号或无符号)类型(参见示例)。
溢出unsigned int
是安全的。溢出签名的不是(未定义的行为)。
MSDN说:
DWORD 是一个 32 位无符号整数(范围:0 到 4294967295 十进制)。该类型声明如下:
typedef unsigned long DWORD
所以应该是安全的。
无符号整数是安全的,有符号则不是。但我从来没有遇到过一个不做明显的双补的平台。我真希望标准人们咬紧牙关,让它成为强制性的。