Простейшая задачка на типы данных

Garryss

Что-то туплю. Хочу написать такую функцию:
 
uint64_t range_size(int64_t low, int64_t high);

Должна возвращать количество элементов между low и high включительно. Например, range_size(-5, 5) = 11. Функция должна корректно обрабатывать все возможные значения аргументов, включая INT64_MIN (но при этом гарантируется low <= high).
Всё, что ни придумаю, — целая куча IF-ов. А опыт подсказывает, что здесь должен быть простой битовый one-liner.

zorin29

range_size(int64_min, int64_max) = 2^64, т.е. не влезет в uint64_t, разве не так?
Внутреннее чувство мне почему-то подсказывает, что просто (unit64_t)max - (uint64_t)min + 1 - это и будет то, что тебе нужно, кроме одного случая выше.

Whoman-in-white

что просто (unit64_t)max - (uint64_t)min + 1
для того же (-5, 5) ни static_cast, ни reinterpret_cast не дадут правильного значения же
Мб ты имел ввиду reinterpret_cast<uint64_t>(max - min + 1) ?

Garryss

все верно написал. Тут работает магия two`s complement. Для понятности можешь нарисовать окружность со всеми возможными битовыми значениями (хотя бы для 3-битных чисел), а рядом с каждым значением — его знаковое и беззнаковое представления. И удостовериться, что разница (== дуга окружности) всегда будет корректна.

Whoman-in-white

да, тупанул чет
Оставить комментарий
Имя или ник:
Комментарий: