我一直在努力理解减法溢出的一天中的大部分时间,而且我在网上发现的分配材料目前过于密集而无法理解,所以我真的想要一些直截了当的答案:
int32_t x = 0x8000000;
int32_t y = 0x7000000;
int32_t diff = (x-y);
机器是32位,所以没有“促进”我的理解,机器使用2的赞美。这应该导致溢出。我的问题是:关于变量差异有什么我可以知道的吗?我能毫无疑问地知道它的标志吗?它是相对于两个变量中的任何一个的值。我看过关于定义行为的帖子,但它们对我来说完全没有意义。
答案 0 :(得分:0)
这里没有溢出。
x
的值为-1
(实际上转换是实现定义的,但这是常见的行为),y
是正数(符号位未设置) )。
因此-y
是正数,然后-y + x
(即-y - 1)
不会溢出。
答案 1 :(得分:0)
使用当前编辑的0x8000000
和0x7000000
值:“我对变量diff
有什么了解吗?”。否。
int32_t x = 0x8000000; // -2147483648
int32_t y = 0x7000000; // 1879048192
// Arithmetic result of -4026531840 not representable as int32_t
int32_t diff = (x-y);
有符号整数减法导致这些值溢出,结果为“未定义行为”或UB。跨平台无法保证结果。
C11dr 3.4.3 3“未定义行为的一个例子是整数溢出的行为。”
可以预测溢出,从而避免溢出。但根据OP的其他问题,不想要如何做到这一点的细节。参考:Integer overflow with subtraction