回答
这是32位整数的工作原理。它适用于任何其他位长度。
最大的负数是-1。
最小的负数是-2^31。
如果结果大于或等于2^31或小于-2^31,则发生溢出。
通过从最大的一个减去最小的数字,您可以得到最大的减法结果。 -1 - ( - 2^31)= 2^31 - 1这足够小。
通过从最小的数中减去最大的数,可以得到最小的减法结果。 -2^31 - ( - 1)= - (2^31 - 1)。这大于-2^31。
这样的减法可以得到的数字范围是[MIN_INT + 1,MAX_INT],因此永远不会溢出。
为什么?
让有MIN_INT <= x,y < 0
这样:MIN_INT = MIN_INT-0 < x-y < 0-MIN_INT = MAX_INT+1
并由此MIN_INT < x-y < MAX_INT + 1
注意,“强” <
防止溢出。
您的范围不正确,最大的积极差异是MAX_INT,而不是MAX_INT-1。 –
@PaulR:感谢您的评论,我编辑我的答案是更准确。 – amit
由于负符号的整数的范围是-1
到-(MAX_INT+1)
,两个这样的数字之间可能存在的差异范围是-MAX_INT
到MAX_INT
。由于这个范围很容易表示(请记住整个带符号的整数范围是-(MAX_INT+1)
到MAX_INT
),那么显然永远不会有溢出。
- 1. 如何在检测两个2的补码整数时检测溢出?
- 2. 溢出检测减去2个多头
- 3. 用2'补码技术表示负数?
- 4. 长整数溢出
- 5. Python的numpy减法没有负数(4-6给出254)
- 6. 在x64上没有溢出溢出
- 7. 有效的方法来避免整数溢出?
- 8. 在Clojure中没有得到整数溢出?
- 9. 平均两个整数(或长)没有溢出,截断为0
- 10. 发现2的负没有
- 11. 的JavaScript整数溢出
- 12. 阿达:整数溢出
- 13. 整数溢出操作
- 14. 处理ctype.h整数溢出
- 15. 整数溢出问题
- 16. 没有负数
- 17. Hadoop - 减少溢出记录的数量
- 18. 一元减与二的补码使数字为负
- 19. jqGrid没有正确溢出
- 20. 为什么turbo c环绕有符号整数溢出每次虽然有符号整数溢出未定义?
- 21. 如何用2的补数表示一个小数的负数?
- 22. DIY九修补没有重新调整
- 23. 什么情况可能导致整数相减或加法溢出?我没有得到差异
- 24. Struts 2 JQuery Grid没有显示出来
- 25. 逻辑:从整数中减去整数
- 26. 使用二进制补码的负整数的Perl函数
- 27. 从整数列表中删除所有负整数
- 28. 整数溢出3和5的倍数
- 29. 模数除法中的整数溢出
- 30. JScrollPane没有出现,元素溢出
出于同样的原因,添加负整数和正整数不会溢出。 –
这并不能清除它。谨慎解释? –
想一想 - 当您向正整数添加负整数时,结果必须位于两个起始值之间的某个位置。因此它可以用与起始值相同的位数表示。对于两个负数减去它是同样的事情 - 只要考虑你将一个数字的“减号”加到另一个数字上,使它成为正数和负数的加法。 –