gpt4 book ai didi

c - 如何在没有未定义行为的情况下检查 C 中的有符号整数溢出?

转载 作者:太空狗 更新时间:2023-10-29 16:23:59 24 4
gpt4 key购买 nike

有 (1):

// assume x,y are non-negative
if(x > max - y) error;

和(2):

// assume x,y are non-negative
int sum = x + y;
if(sum < x || sum < y) error;

哪个是首选或是否有更好的方法。

最佳答案

整数溢出是 C 中“未定义行为”的典型示例(请注意,对无符号整数的操作永远不会溢出,它们被定义为环绕)。这意味着一旦你执行了 x + y ,如果它溢出了,你已经被冲洗干净了。现在进行任何检查都为时已晚——您的程序可能已经崩溃了。可以把它想象成检查是否被零除 - 如果你等到除法被执行后再检查,那就太晚了。

所以这意味着方法 (1) 是唯一正确的方法。对于 max , 你可以使用 INT_MAX来自 <limits.h> .

如果x和/或 y可能是负数,那么事情就更难了——你需要以测试本身不会导致溢出的方式进行测试。

if ((y > 0 && x > INT_MAX - y) ||
(y < 0 && x < INT_MIN - y))
{
/* Oh no, overflow */
}
else
{
sum = x + y;
}

关于c - 如何在没有未定义行为的情况下检查 C 中的有符号整数溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2633661/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com