Подтвердить что ты не робот

Так много способов определить байт

Имеет ли значение то, что я использую в objective-c (особенно на iOS)? Я предполагаю, что это происходит от наследования от C и его типов, а также для наследования типов из Mac OS, на которых основана iOS, но я не знаю, какой из них я должен использовать:

unsigned char от... ну.. компилятор?

uint8_t от stdint.h

UInt8 из MacTypes.h

Byte из MacTypes.h

Bytef от zconf.h

Я знаю, что различные defs предназначены для соображений переносимости, а использование литералов типа unsigned char - это не хорошее будущее мышление (размер может измениться, и все закончится, как и Windows API снова). Мне бы хотелось, чтобы некоторые советы о том, как найти лучшие для моих целей. Или хороший язычок, если я просто глуп...

EDIT. Просто для получения дополнительной информации, если я хочу что-то, что всегда будет 1 байт, следует ли использовать uint8_t (похоже, это не изменится с таким именем)? Я хотел бы думать, что UInt8 тоже не изменится, но я вижу, что определение UInt32 зависит от того, является ли процессор 64-разрядным.

ДАЛЬНЕЙШЕЕ ИЗОБРАЖЕНИЕ. Когда я говорю байт, я имею в виду, что я хочу 8 бит. Я выполняю операции сжатия пикселей (32 бита → 8 бит) для хранения на диске.

4b9b3361

Ответ 1

Это совершенно безразлично. Какой бы вы ни использовали, он, скорее всего, окажется unsigned char. Если вы хотите, чтобы он выглядел красиво, я предлагаю вам использовать uint8_t из <stdint.h>.

Ни один из них не изменится с архитектурой. char всегда 1 байт в соответствии со стандартом C, и он был бы невозможен с точки зрения пользователя, если в реализации UInt8 внезапно превратился в 16 бит длиной.

(Однако это не так, что char требуется 8 бит в ширину, только если имя типа предполагает, что оно имеет 8 бит в длину, тогда любая разумная реализация действительно набирает его как таковую Кстати, байт (который char) часто является 8-битным модулем, то есть октетом.)

Ответ 2

Как и в каждом языке программирования, полученном из модели типа C-языка, Objective C имеет несколько опций эквивалент для объявления 8-разрядного целого числа.

Почему я сказал эквивалент? Поскольку, как правильно указано OP, очевидно, что все эти параметры в конечном итоге typedef -ed до unsigned char встроенного типа компилятора. На данный момент это правильно, и, позвольте говорить практически, никто не станет править, чтобы в будущем они были не 8-разрядными целыми числами.

Таким образом, фактический вопрос здесь , что является лучшим порядком для определения приоритетов при выборе имени типа для 8-битного целого?

Чтение кода

Так как в основном в каждом коде, имеющем корни языка C, примитивные имена типов беспорядок. Поэтому, вероятно, самый важный фактор - читаемость. И я имею в виду четкую и однозначно идентифицируемую цель выбора этого конкретного типа для этого конкретного целого для большинства людей, которые будут читать ваш код.

Итак, давайте взглянем на эти типы со средней точки зрения программиста Objective C, которая мало знает о языке C.

  • unsigned char - что это??? почему char когда-либо подразумевается под подпиской???
  • uint8_t - ok, unsigned 8-битное целое число
  • UInt8 - hmm, то же, что и выше
  • Byte - подписанное или неподписанное 8-битное целое число
  • Bytef - что это? байт-поплавок? что означает "f"?

Очевидно, что unsigned char и Bytef не являются хорошим выбором.

Идем дальше, вы можете заметить еще одну неприятность с именем типа Byte: вы не можете точно сказать, представляет ли она signed или unsigned целое число, что может быть чрезвычайно важно, когда вы пытаетесь понять, что такое диапазон значений этого целого может сохраняться (-128.. 127 или 0.. 256). Это также не добавляет к читаемости кода.

Единый стиль кода

Теперь у нас осталось 2 типа имен: uint8_t и UInt8. Как выбрать между ними?

Опять же, глядя на них глазами программиста Objective C, который часто использует имена типов, такие как NSInteger, NSUInteger, выглядит очень естественно, когда видит UInt8. uint8_t просто выглядит очень низкоуровневым.

Заключение

Таким образом, в итоге мы остаемся с единственной опцией - UInt8. Это четко идентифицируется с точки зрения количества бит, дальности и привычки. Так что это, вероятно, лучший выбор здесь.