gpt4 book ai didi

c - 我如何确定是否可以在 C 中计算 x+y 而不会溢出?

转载 作者:行者123 更新时间:2023-11-30 19:51:51 25 4
gpt4 key购买 nike

我只能使用操作! 〜&^! + << >>,我在掌握溢出方面遇到困难,可以使用任何提示或帮助!

最佳答案

这取决于数字是有符号还是无符号。

如果两个操作数都是无符号的,溢出将返回到 0。

如果一个或两个操作数都有符号,则行为由实现定义,但是大多数实现都表示 2 的补码中的有符号整数,因此在这些情况下,正溢出将回绕到负数一侧,而负溢出将回绕到正数侧面。

在无符号溢出的情况下,结果将小于至少一个操作数,因此您可以通过以下方式进行测试:

if ((x + y < x) || (x + y < y) {
printf("overflow\n");
}

在签名的情况下,您首先需要检查两者是否都是正数(并检查负环绕)或都是负数(并检查正环绕):

if ((x > 0) && (y > 0) && ((x + y < x) || (x + y < y))) {
printf("negative overflow\n");
}
if ((x < 0) && (y < 0) && ((x + y > x) || (x + y > y))) {
printf("positive overflow\n");
}

正如我之前提到的,带符号的情况是实现定义的,并且只有当带符号整数表示为 2 的补码时,上述内容才有效。但在实践中,通常会出现这种情况。

这应该让您了解溢出是如何工作的,尽管它不仅仅使用您提到的特定运算符。有了这个,您应该能够弄清楚如何使用其他运算符来实现上面表达式的功能。

关于c - 我如何确定是否可以在 C 中计算 x+y 而不会溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35215363/

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