为什么在通过直接函数调用替换变量时会得到不同的结果?

时间:2017-05-10 19:39:42

标签: c integer-overflow typing

我有这个代码可以正常工作:

long nodeDistance(node_t a, node_t b) {
    long d1 = abs(a.passi_1 - b.passi_2);
    long d2 = abs(a.passi_2 - b.passi_2);
    return d1 + d2;
}

我通过链接列表调用它,它返回一个看似合理的正面结果(120259067966)。但是,当我内联这两个变量时,它的行为非常奇怪;我也注意到它的编译速度要慢得多。

long nodeDistance(node_t a, node_t b) {
    return abs(a.passi_1 - b.passi_1) + abs(a.passi_2 - b.passi_2);
}

通过同一个链接列表调用它时,它将返回一个负值(-16322)。这是为什么?

1 个答案:

答案 0 :(得分:2)

这是因为第二个函数溢出:abs返回int,因此abs(...) + abs(...)的结果是int(有时会溢出),然后通过long关键字转换为return

另一方面,第一个函数通过将操作数存储到long变量中将操作数转换为long,因此它们的总和也是long,并且它不会溢出