检查字大小的变量是否具有算术运算后的进位

时间:2010-07-28 19:27:21

标签: c

大多数编译器是否能够检查代码中先前执行的添加操作是否导致进位?

例如:

unsigned int n = 0xFFFFFFFF; // 8 F's
// doing some stuff here ... 
n = n + 1;
// doing some stuff here, without changing the value of @var n
if (n > UINT_MAX) {
  // n has a carry
}

3 个答案:

答案 0 :(得分:4)

通常在C中,判断是否发生溢出(至少是无符号整数)的方法是加法的结果是否小于任何一个操作数。这表示溢出。据我所知,没有异常或溢出通知。

快速谷歌搜索:

http://www.fefe.de/intof.html

  

不幸的是,没有办法   直接从C访问这个进位。

答案 1 :(得分:2)

这是运行时条件,因此不在编译器的域中。实际上,进位操作的CPU状态将在下一个影响标志的指令时丢失。

您需要在程序代码中检测到此类溢出。

答案 2 :(得分:2)

在您的示例中,无符号整数将回绕到0(假设您的c实现使用32位无符号整数)。编译器无法判断它们是否环绕,您需要检查结果才能看到。

if (n > n + 1) { /* wrap around */ }