Цитата(rezident @ Oct 27 2005, 16:17)
"0 - rd_ptr" эквиавалентно переводу значения rd_ptr в дополнительный код, при сложении с wr_ptr в результате получается операция вычитания. Суть в том, что значение size получается положительным (разность по модулю) в результате любого ветвления.
size всегда получается >= 0, т.к. объявлен как uint.
И результат будет один и тот же при любом ветвлении.
Возможно там хотели написать else size = rd_ptr - wr_ptr;
Цитата(rezident @ Oct 27 2005, 16:17)
Кстати, обращаю внимание что переменная size здесь имеет тип unsigned int, а переменные rd_ptr и wr_ptr unsigned long. Если бы константой был не 0, который при любой раскладе = 0, то нужно было бы записывать как size = 0L - rd_ptr + wr_ptr ; или size = (ulong)0 - rd_ptr + wr_ptr ; в противном случае операция была бы не с ulong-овскими числами, а с uint-овскими и результат мог быть неверен. Хотя в этом примере видимо предполагается, что значение size не бывает больше, чем 65535.
Не важно какого типа константа - uint или ulong. Мы ведь результат присваиваем переменной типа uint. Т.е. старшие биты обрежутся, если sizeof(int)<sizeof(long), и останутся неизменными, если равны.