减法溢出行为

时间:2014-04-19 00:34:51

标签: c overflow subtraction

我一直在努力理解减法溢出的一天中的大部分时间,而且我在网上发现的分配材料目前过于密集而无法理解,所以我真的想要一些直截了当的答案:

int32_t x = 0x8000000;
int32_t y = 0x7000000;
int32_t diff = (x-y);

机器是32位,所以没有“促进”我的理解,机器使用2的赞美。这应该导致溢出。我的问题是:关于变量差异有什么我可以知道的吗?我能毫无疑问地知道它的标志吗?它是相对于两个变量中的任何一个的值。我看过关于定义行为的帖子,但它们对我来说完全没有意义。

2 个答案:

答案 0 :(得分:0)

这里没有溢出。

x的值为-1(实际上转换是实现定义的,但这是常见的行为),y是正数(符号位未设置) )。

因此-y是正数,然后-y + x(即-y - 1)不会溢出。

答案 1 :(得分:0)

使用当前编辑的0x80000000x7000000值:“我对变量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