我正在编写一个物理内存管理器,它从 BIOS 获取一些关键系统数据未使用的内存间隔。每个区间都有0 <= start <= 2^32 - 1
和0 <= length <= 2^32
。我已经过滤掉了零长度间隔。
给定两个区间 S 和 T,我想检测它们是如何相交的。例如,S 是否在 T 之前开始并在 T 内结束(图片a)?还是 S 在 T 之前开始并在 T 之后结束(图片c)?
你会认为解决方案是微不足道的:
uint s_end = s_start + s_length;
uint t_end = t_start + t_length;
if (s_start < t_start)
// S starts before T
else if (s_start < t_end)
// S starts within T
else
// S starts after T
if (s_end <= t_start)
// S ends before T
else if (s_end <= t_end)
// S ends within T
else
// S ends after T
问题是溢出:我在技术上仅限于 32 位整数,并且间隔可以(并且经常这样做)使用整个可用整数范围。例如在图b中,t_end
由于溢出而等于 0。甚至,如图f t_start = t_end = s_start = 0
while t_length != 0
。
如何使这些区间相交条件在考虑溢出的情况下工作?
溢出搞砸了我的条件,但我真的不能为此使用 64 位整数(这将是最简单的)。我知道对我的条件进行一些巧妙的改组并使用加法和减法一定是可能的,但是在制作了无尽的图表并思考了几个小时之后,我似乎无法理解它。
虽然我的问题是 32 位整数,但在这张图片中,我使用 4 位整数只是为了简化它。问题仍然相同。