【发布时间】:2012-02-27 05:49:43
【问题描述】:
假设您有两个 32 位 DWORD x 和 y,您如何检测它们的总和是否会导致溢出,而无需借助本机汇编来检查进位标志。我想要一些带有算术或二元运算符的东西。我想可能有一些测试方法可以解决这个问题。谢谢
【问题讨论】:
标签: c++ c overflow addition dword
假设您有两个 32 位 DWORD x 和 y,您如何检测它们的总和是否会导致溢出,而无需借助本机汇编来检查进位标志。我想要一些带有算术或二元运算符的东西。我想可能有一些测试方法可以解决这个问题。谢谢
【问题讨论】:
标签: c++ c overflow addition dword
为什么不测试总和?
DWORD sum = x + y;
bool const overflow = (sum < x);
【讨论】:
-5 不是 unsigned int 的有效值,分配给 DWORD 时变为 0xFFFFFFFB。所以x+y = 0xFFFFFFFB + 5 = 0x100000000,0的32位结果确实是溢出的结果。
const(即没有教授好的做法)。但是,我认为如果我投反对票可能会感到不公平。但请修复。 ;-) 干杯,
如果我错过了任何情况,请告诉我(这在遵循 C++98 或更新标准的编译器中不起作用):
int overflowSum(DWORD a, DWORD b) {
return (b > 0) ? (a + b < a) : (a + b > a);
}
如果你认为你的 DWORD 是无符号的,你可以简化它:
int overflowSum(DWORD a, DWROD b) {
return a + b < a;
}
【讨论】: