我只能使用操作! 〜& ^! + < < >>,我无法抓住溢出,可以使用任何提示或帮助!如何确定我是否可以计算x + y而不溢出C?
回答
这取决于数是否带符号。
如果两个操作数是无符号,如果一个或两个操作数有符号溢出会绕到回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的补码。然而在实践中,这通常是这种情况。
这应该给你的溢出是如何工作的想法,虽然它并不只使用你提到的具体运营。有了这个,你应该能够弄清楚如何使用其他操作符来实现上述表达式。
正如指出的许多国家的人民,这是不对的签署... 所以我改变了它的无符号第一。
您需要通过部分来计算的一部分。
既然你没有告诉我们的数据类型,我以为这是4字节无符号的数据。
unsigned long x, unsigned long y;
// x = ...
// y = ...
unsigned long first_byte_x = (x & 0xFF000000) >> 24;
unsigned long first_byte_y = (y & 0xFF000000) >> 24;
unsigned long other_bytes_x = x & 0x00FFFFFF;
unsigned long other_bytes_y = y & 0x00FFFFFF;
unsigned long other_bytes_sum = other_bytes_x + other_bytes_y;
unsigned long carry = (other_bytes_sum & 0xFF000000) >> 24;
unsigned long first_byte_sum = first_byte_x + first_byte_y + carry;
if (first_byte_sum > 0xFF)
// overflow
else
// not overflow
如果你可以使用mod(%),那么它会更简单。
*它看起来像一个家庭作业,所以我希望你认为你的提问前足......
不需要这样做。对于无符号类型只是't = x + y;溢出= t
对于'x = -1,y = -1'和其他很多失败。 – chux
随着符号的整数运算,除非你有机会像INT_MAX INT_MIN
的限制,也没有答案说得到周围未定义的行为。
#include <limits.h>
int is_overflow_add_signed(int a, int b) {
// This uses -, so does not meet OP's goal.
// Available as a guide
return (a < 0) ? (b < INT_MIN - a) : (b > INT_MAX - a);
}
用无符号数学,只要看看结果是否“包裹”了。
int is_overflow_add_unsigned(unsigned a, unsigned b) {
return (a + b) < a;
}
- 1. 如何让溢出只在x而不是y
- 2. 减CSS: '计算值(X + Y)' 输出 '计算值(Z)',而不是仅仅 'Z'
- 3. 溢出 - X和溢出-Y是不是在铬
- 4. 如何使相对股利绝对定位div在x溢价而不是y
- 5. 使用base X,我可以使用Y字符计算多高?
- 6. C#中定值溢出计算错误
- 7. [] .concat([“x”,“y”],“z”) - >如何获得[[“x”,“y”],“z”]而不是[“x”,“y” , “Z”]?
- 8. 溢出-y覆盖溢出-y
- 9. 创建方法,检查x + y是否会使用按位运算溢出
- 10. 为什么只有当我使用'x,y = y,x + y格式而不是'x = y; y = x + y'?
- 11. 是否可以确定某个元素当前是否溢出其容器?
- 12. 如何确定我的ractive计算值是否已更改
- 13. 是否可以突出显示Highcharts上的x和y轴
- 14. 我如何可以将工具栏,而不是溢出菜单下溢出菜单重叠工具栏
- 15. 溢出计算VBA
- 16. Math.IEEERemainder(x,y)是否等同于x%y?
- 17. 我们如何计算旋转图像的正确x和y值?
- 18. 溢出y属性
- 19. CSS Overflow-x隐藏和溢出-y
- 20. 如何确定编辑框是否溢出(Matlab GUI)?
- 21. 当我添加溢出-Y
- 22. 是否可以预测数学运算是否会导致溢出?
- 23. 在C++中舍入而不溢出
- 24. 我可以找到可以计算列名称X的表吗?
- 25. 你如何计算整数溢出?
- 26. 如何确定计算是否已完成或检测到计算中断?
- 27. C - 输出值计算不正确
- 28. MySQL:是否可以计算MAX(AVG(field))?
- 29. 是否可以确定SKStore Review Controller是否已经出现。
- 30. 这是否正确计算第n根?
不能使用'-'? – user3386109
这是一个相当不错的家庭作业问题,但过于宽泛,因为堆栈溢出不是教程网站。你必须解决你自己。只是:假设你必须使用带符号的整数类型,你必须在发生**之前捕获溢出**,否则所有投注都关闭。所以你必须检查组合操作数是否会超出界限。提示:您必须使用limits.h并认为“溢出”实际上意味着什么。每个操作员都有所不同。 – Olaf
[如何检测C/C++中的整数溢出?](http:// stackoverflow。com/q/199333/995714) –