При использовании целочисленных значений в моем собственном коде я всегда стараюсь рассмотреть подпись, спрашивая себя, должно ли целое число быть подписано или без знака.
Когда я уверен, что значение никогда не будет отрицательным, я тогда использую целое число без знака.
И я должен сказать, что это происходит большую часть времени.
При чтении кода других людей я редко вижу целые числа без знака, даже если представленное значение не может быть отрицательным.
Итак, я спросил себя: "есть ли веская причина для этого или люди просто используют целые числа со знаком, потому что им все равно" ?
У меня есть поиск по этой теме, здесь и в других местах, и я должен сказать, что не могу найти хорошую причину не использовать целые числа без знака, когда это применимо.
Я столкнулся с этими вопросами: "По умолчанию тип int: Signed or Unsigned?" и "Если вы всегда используете 'int' для чисел в C, даже если они неотрицательны?", которые оба приводят следующий пример:
for( unsigned int i = foo.Length() - 1; i >= 0; --i ) {}
Для меня это просто плохой дизайн. Конечно, это может привести к бесконечному циклу с целыми числами без знака.
Но так сложно проверить, если foo.Length()
равно 0, перед циклом?
Поэтому я лично не думаю, что это хорошая причина для использования целых чисел со знаком.
Некоторые люди могут также сказать, что целые числа со знаком могут быть полезны даже для неотрицательных значений, чтобы обеспечить флаг ошибки, обычно -1
.
Хорошо, что хорошо иметь определенное значение, что означает "ошибка".
Но тогда, что не так с чем-то вроде UINT_MAX
, для этого конкретного значения?
Я действительно задаю этот вопрос, потому что это может привести к огромным проблемам, обычно при использовании сторонних библиотек.
В таком случае вам часто приходится иметь дело со значениями со знаком и без знака.
В большинстве случаев люди просто не интересуются подписью и просто назначают, например, unsigned int
, на signed int
, не проверяя диапазон.
Я должен сказать, что я немного параноик с флагами предупреждений компилятора, поэтому с моей установкой такой неявный приведение приведет к ошибке компилятора. < br/" >
Для такого рода вещей я обычно использую функцию или макрос для проверки диапазона, а затем назначаю использование явного приведения, при необходимости поднимая ошибку.
Мне это кажется логичным.
В качестве последнего примера, поскольку я также разработчик Objective-C (обратите внимание, что этот вопрос не связан только с Objective-C):
- ( NSInteger )tableView: ( UITableView * )tableView numberOfRowsInSection: ( NSInteger )section;
Для тех, кто не владеет текстом Objective-C, NSInteger
является целым знаком.
Этот метод фактически извлекает количество строк в представлении таблицы для определенного раздела.
Результат будет никогда отрицательным (как номер раздела, кстати).
Итак, зачем использовать целое число со знаком для этого?
Я действительно не понимаю.
Это всего лишь пример, но я всегда вижу такие вещи с помощью C, С++ или Objective-C.
Итак, опять же, мне просто интересно, просто ли люди не заботятся о таких проблемах, или, если есть, наконец, хорошая и действительная причина не для используйте целые числа без знака для таких случаев.
С нетерпением ждем ваших ответов:)