C 有意值溢出是否安全?

C 有意值溢出是否安全?,c,windows,integer-overflow,C,Windows,Integer Overflow,这个问题可能很愚蠢或偏执,但无论如何:-)。给定以下代码: DWORD hiRes; // will overflow about once in an hour hiRes = GetTickCount() * 1193L; 如果知道hiRes定期溢出,并且这些情况得到了正确处理,那么这个代码有什么问题吗 更新: 这个结果让我非常惊讶,因为答案取决于C标准()定义的雇佣类型(有符号或无符号)。溢出无符号int是安全的。溢出一个有符号的不是(未定义的行为) 说: DWORD是一个32位的无符

这个问题可能很愚蠢或偏执,但无论如何:-)。给定以下代码:

DWORD hiRes;

// will overflow about once in an hour
hiRes = GetTickCount() * 1193L;
如果知道
hiRes
定期溢出,并且这些情况得到了正确处理,那么这个代码有什么问题吗

更新:
这个结果让我非常惊讶,因为答案取决于C标准()定义的
雇佣类型(有符号或无符号)。

溢出
无符号int
是安全的。溢出一个有符号的不是(未定义的行为)

说:

DWORD是一个32位的无符号整数(范围:0到4294967295) 十进制)。此类型声明如下:

typedef unsigned long DWORD

所以它应该是安全的。

无符号整数是安全的,有符号整数不是。但我从来没有穿过一个平台,它不做明显的二者互补的事情。我真希望《标准》的制定者们已经忍无可忍,只是强制执行而已。

DWORD在Windows中是“typedef unsigned long DWORD;”。签名的Owerflow以什么方式不安全?这就是unsigned的区别?它们是不安全的,因为C标准说它们是未定义的行为。但在Windows平台上,我认为您不会看到任何意外情况。没有愚蠢的问题,只有愚蠢的答案。任何好的编译器都会在假设代码不调用签名溢出的情况下进行优化。这意味着依赖于签名溢出的可预测行为的代码被破坏。另请参见:-)