【问题标题】:Detecting 32-bit dword + dword carry / C++检测 32 位 dword + dword 进位 / C++
【发布时间】:2012-02-27 05:49:43
【问题描述】:

假设您有两个 32 位 DWORD x 和 y,您如何检测它们的总和是否会导致溢出,而​​无需借助本机汇编来检查进位标志。我想要一些带有算术或二元运算符的东西。我想可能有一些测试方法可以解决这个问题。谢谢

【问题讨论】:

标签: c++ c overflow addition dword


【解决方案1】:

为什么不测试总和?

DWORD sum = x + y;
bool const overflow = (sum < x);

【讨论】:

  • 如果 x = 5 和 y = -5,尽管它没有溢出,但你会得到正确的结果,因为总和小于 x。
  • @Mario:DWORD 类型通常是无符号的。
  • @Mario:这不太正确。 -5 不是 unsigned int 的有效值,分配给 DWORD 时变为 0xFFFFFFFB。所以x+y = 0xFFFFFFFB + 5 = 0x100000000,0的32位结果确实是溢出的结果。
  • 不必要的额外检查,缺少const(即没有教授好的做法)。但是,我认为如果我投反对票可能会感到不公平。但请修复。 ;-) 干杯,
  • @BicycleDude:好的,我自己修复了你的代码。但请注意 cmets 需要修复的事情。不要想当然地认为其他人会介入并为您解决问题。
【解决方案2】:

如果我错过了任何情况,请告诉我(这在遵循 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;
}

【讨论】:

  • 有符号整数溢出是未定义的行为。
  • 由于有符号整数溢出的行为未定义,编译器优化器可以并且确实假设您的代码不会导致有符号整数溢出.请参阅here 了解更多信息。
  • 梦想是正确的。 C++ 中未指定有符号溢出行为,您的方法可能不仅取决于特定的 CPU 架构,还取决于它当前所处的模式。非常不安全且不可移植。
  • +1 表示不添加不必要的检查。 @dreamlax 注意:OP 的术语,使用“DWORD”,暗示 Windows 或至少 PC 平台。
  • @AlfP.Steinbach:您能重申一下您的观点吗?我是否正确理解您的意思是,尽管 C++ 标准没有定义有符号整数溢出的行为,但依赖于它的特定行为在具有任何编译器的所有 Windows 上都是 正确 ?
猜你喜欢
  • 2010-09-07
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多