【发布时间】:2018-09-30 14:32:32
【问题描述】:
两个数字之间的距离通常是这样计算的:
long distance(long x, long y)
{
return x > y ? x - y : y - x;
}
但是,使用带符号的 x 和 y 这些减法可能会溢出,因此该函数可以在 C 和 C++ 中调用未定义的行为。
解决该问题的一种方法是使用无符号类型来表示结果距离。距离不能为负数,因此不需要有符号类型。有符号类型的最小值和最大值之间的距离应适合相同大小的无符号类型。 (编辑: 正如 chux 回答的那样,这不是完全正确的假设。)所以我确实修改了第一个函数:
unsigned long distance(long x, long y)
{
return (x > y) ? (unsigned long)x - (unsigned long)y
: (unsigned long)y - (unsigned long)x;
}
它现在是否以符合标准且可移植的方式正确计算两个有符号长整数之间的距离?如果没有,解决办法是什么?
【问题讨论】:
-
选择一个,C 或 C++。两者的答案可能相同,但您应该分别询问,因为它们是具有不同规范的不同语言。您可以为每种语言分别输入相同的问题。
-
如果我错了,请纠正我,但是如果您将两个整数相加而不是减去两个整数,则存在溢出的可能性???
-
有符号到无符号的转换使用二进制补码,并且定义明确,所以上面应该定义清楚。可悲的是,鉴于当今 C++ 世界完全过度设计的状态,从标准中找到所有相关的权威引用可能需要一天的大部分时间,我需要去买杂货;所以我会说这是很好的定义,然后继续。
-
@MukeshVerma 考虑
int x = INT_MIN; int y = INT_MAX; x = y - x;。 -
@peter:为什么会出乎意料? LONG_MAX - LONG_MIN 正好是 ULONG_MAX。
标签: c++ c language-lawyer distance