Сейчас поведаю об одной истории картечи в ногу (конечно же, речь о C++).
Пусть есть цикл, по которому нужно пройтись в обратном порядке. Случай не применим к итераторам, т.е. нужен счетчик.
Вариант 1: for(
unsigned int moment = (time_block_size_ - 1); moment > -1; --moment)
Хороша попытка, но во время сравнения -1 будет приведен к unsigned и.. тело цикла не выполнится ни разу.
Вариант 2: for(
unsigned int moment = (time_block_size_ - 1); moment >= 0; --moment)
Вроде бы все хорошо, но и теперь undefined behavior после того, как счетчик уменьшится с нулевого значения.
Сухой остаток:
for(
int moment = (time_block_size_ - 1); moment >= 0; --moment) -- безотказный вариант.
Как итог, могу сказать, что unsigned типы таят в себе большую опасность при неявном преобразовании от соответствующего signed аналога, поэтому иной раз стоит задуматься, так ли они нужны ? А нужны они, на мой взгляд, только в побитовых операциях, поскольку четко отражают семантику сдвига (старший бит не сохраняется, в отличии от сдвига signed значения). Однако и тут наиболее лучшим способом можно обойтись std::bitset, который на стадии компиляции определяет свой размер, либо boost::dynamic_bitset из Boost или QBitArray из Qt. Предпочтительнее, конечно, вариант от boost, поскольку имеется более широкий интерфейс (в том числе, перегружены сдвиговые операции).