Этот совет верен только в том случае, если ваши два события a и b, a действительно произошли до b, а расстояние между ними меньше 2 ^ (32-1). Если вы рассчитаете (б-а), то вы получите правильный ответ. Если вы вычтите меньшее беззнаковое значение из большего беззнакового (думая, что определяет порядок их времени), то вы можете получить отрицательный ответ на ваш вопрос.
Итак, вам необходимо учесть новую операцию циклического сравнения (см. Linux time_after, time_before и используйте их и т. Д.).
Сравнение как со знаком, так и со знаком без знака было бы неправильным, потому что счетчики, которые оборачиваются, не совсем то же самое, что числа со знаком или без знака. Рассмотрим 8-битный случай:
a=250, b=20 #8-bit sequence number a was created before b
a=120, b=130 #8-bit sequence number a was created before b
Основным различием между знаковыми и беззнаковыми значениями с одинаковым количеством битов являются реализации операторов сравнения. Подписанный и неподписанный имеет значение при присвоении значения с большим количеством битов, поскольку решение подписать расширение отрицательных значений с 1 или 0.
Рассмотрим новое определение меньше, чем предназначенное для чисел, которые охватывают:
LT_CIRCULAR_32(250,5) == True //like signed?
LT_CIRCULAR_32(0,11) == True
LT_CIRCULAR_32(127,138) == True //like unsigned?
Это сравнение работает до тех пор, пока фактическое расстояние между первым и вторым значением всегда меньше 2 ^ (32-1).
Представьте себе круг с 256 позициями на нем и счетчиками a и b, движущимися по часовой стрелке. Если a может достичь b с шагом менее 2 ^ (8-1), тогда "a
#define LT_CIRCULAR_LONG(a,b) ((((long)(b)-(long)(a)) < 0)==0)
Вот почему time_after выглядит так, как оно. Приведения b и a по отдельности гарантируют, что знаки расширяются. Создание значения со знаком и проверка на значение меньше нуля - хитрость для проверки старшего бита.
Я наблюдаю, как один из разработчиков сейчас решает эту проблему с jiffies (то есть: -300 jiffies), и видел ее с порядковыми номерами TCP и несколькими другими аналогичными счетчиками. Таким образом, комплимент 2s не справляется со всем этим.