Что было с исторических типов суп для целых чисел в программах на C?

Это возможно, глупый вопрос, ответ на который я, наверное, знаю.

Пятнадцать лет назад или около того, много кода на C я'd посмотрите, было много целочисленных типов, в платформе особую директиву#ifdef это. Казалось, каждая программа или библиотека я посмотрел на были свои, взаимно несовместимые typedef для супа. Я не'т знаем многое о программировании на тот момент и это казалось странным кучу обручи, чтобы прыгать через Просто, чтобы сообщить компилятору, какой число вы хотели использовать.

Я'вэ собрать историю в мой ум, чтобы объяснить, что этих типов были, но я не'т действительно знаю, является ли это's садится. Мое предположение состоит в том, что когда C был впервые разработан и стандартизирован, это было'т понял, как важно уметь платформы-самостоятельно получить целочисленный тип определенного размера, и таким образом все оригинальные с целочисленных типов могут быть разных размеров на разных платформах. Таким образом, каждый пытается написать переносимый код на C должен был сделать это сами.

Это правильно? Если да, то как было программисты должны использовать с целочисленных типов? Я имею в виду, на низкоуровневом языке с большим количеством бит сложа, разве'т важно, чтобы иметь возможность сказать: "это 32-разрядное целое число и"? А поскольку язык был стандартизирован в 1989 году, безусловно, там были некоторые думали, что люди будут пытаться писать переносимый код?

Комментарии к вопросу (18)
Решение

Когда с начала компьютеры были менее однородными и гораздо меньше связаны, чем сегодня. Было видно, как более важные для удобоносимости, что типа int будет естественный размер(ы) для компьютера. Просят ровно 32-разрядный целочисленный тип на 36-битной системе, вероятно, будет в результате неэффективного кода.

А потом появился повсеместной сети, где вы работаете с конкретными на проводе поля размер. Теперь взаимодействие очень разных. И 'октет' становится де-факто кванты типы данных.

Теперь вам нужно ИНЦ точных кратными 8 битам, так что теперь вы сделать определение типа суп и затем в конечном счете стандартный догоняет и мы имеют стандартные названия для них и суп не нужен.

Комментарии (18)

С'раньше успех был достигнут благодаря его flexibility адаптироваться к практически всех существующих архитектур вариант @Джон Hascall с:

  1. родной integer размеры 8, 16, 18, 24, 32, 36, и т. д. бит,
  2. вариант знаковое целое число модели: 2'с дополнением, 1'с дополнением, целочисленный и
  3. различные прямой, большой, маленький и другие.

В развитых кодирования, алгоритмов и обмена данными толкнул на большее единообразие и поэтому потребность в видах, которые встречали 1 &ампер; 2 выше на разных платформах. Шифровальщики свое собственное как тип int int32 значениевнутриесли ...`. Множество вариаций, созданных суп как отмечает ОП.


В C99 было добавлено (у)int_leastN_t, (у)int_fastN_t, (у)intmax_t, чтобы сделать портативный еще somewhat минимальной бит-ширина-Несс типов. Эти типы необходимы для n = 8,16,32,64.

Кроме того, появились полу-optional типов (см. ниже **) как(и)intN_t`, который имеет дополнительные атрибуты, они должны быть 2'ы дополнит и без заполнения. Это такие популярные виды, которые настолько широко нужные и использовать, чтобы проредить integer soup.


как были программисты должны использовать с целочисленных типов?

Писать гибкий код, который не сильно полагаться на разрядность. Это довольно легко код `strtol (), используя только LONG_MIN, значение long_max, без учета бита-ширина/прямой/число кодирования.

Однако многие задачи кодирования обязывает точных ширина видах и 2'ы дополнением для удобной высокой производительности кодирования. Лучше в этом случае отказаться от переносимости до 36-битных систем и 32-разрядных знак-величины те и палка о 2<суп>П</SUP-серфинг> широкий (2'ы дополнит подпись) целых чисел. Различные КПР & давай крипто алгоритмы и форматы файлов на ум. Таким образом, потребность в фиксированной ширины типов и определенного (С99) способ сделать это.


Сегодня есть еще проблемы что еще нужно управлять. Пример: обычные акции инт/без знака потерять некоторый контроль, так как эти типы могут быть 16, 32 или 64.


**

эти типы являются необязательными. Однако, если реализация обеспечивает целочисленные типы с шириной 8, 16, 32 или 64 бит, нет бита заполнения, а затем (для знаковых типов), которые имеют представление дополнения two, он должен определить соответствующие имена typedef. С11 7.20.1.1 точную ширину целочисленные типы 3

Комментарии (2)

Я вспоминаю тот период и я'м виноват же!

Один вопрос был размером типа int, он может быть таким же, как "короткая" или "длинная" или между ними. Например, если вы работаете с двоичными форматами, это было необходимо, чтобы все выровнять. Порядок байтов сложные вещи, а также. Многие застройщик пошел ленивый маршрута и fwrite, что, вместо того, чтобы выбирать цифры только побайтовое. Когда машины модернизировали больше длины слова, весь ад вырвался на свободу. Так типов был простой хак, чтобы исправить это.

Если производительность является проблемой, как это часто было тогда, как int был гарантированно автомата'с быстрым в натуральную величину, но если вам нужно 32 бита, и типа int был меньше, ты был в опасности опрокидывания.

В языке C оператор sizeof () не должен быть решен на стадии препроцессора, который сделал вещи сложно, потому что вы не&#39;т сделать#если sizeof(тип int) == 4` например.

Лично, некоторые обоснование также просто работать с ассемблер язык и мышление не желая обобщить понятие о том, что короткий, int, а длинный для. Тогда ассемблер был использован в C довольно часто.

В настоящее время, есть много не бинарные форматы файлов, в формате JSON, XML и т. д. где он не'т важно, что в двоичном представлении. Также, многих популярных платформ расположились на 32-бит int или дольше, что обычно достаточно для большинства целей, так там's меньше проблем с опрокидыванием.

Комментарии (5)

C-это продукт начала 1970-х годов, когда вычислительная экосистема была совсем другой. Вместо миллионов компьютеров, взаимодействующих между собой более разветвленную сеть, может, у вас есть сто тысяч систем по всему миру, на каждом из которых работает несколько монолитных приложений, почти без связи между системами. Вы не мог'т предположим, что для любых двух архитектур размер слова, или представлены подписанные целые числа таким же образом. Рынок был еще достаточно мал, что там'т-либо реальной нужды в стандартизации, компьютеры'т поговорить друг с другом (много), и никто даже не столько о переносимости.

если это так, как программисты должны использовать с целочисленных типов?

Если вы хотели максимально писать переносимый код, то вы не'т предположить, что за то, что гарантированный стандарт. В случае инт, это означало, что вы ничего'т предположить, что он может представлять ничего вне диапазона [-32767,32767], и не предположить, что она будет представлена в 2'с дополнением, не предположить, что он был определенной ширины (это может быть шире, чем 16 бит, но по-прежнему представляют только 16-битный диапазон, если в нем содержатся какие-перетяжка биты).

Если вы не'т заботиться о переносимости, или вы делаете вещи, которые были портабельными (какой бит сложа обычно есть), то вы использовали любой тип(ы) познакомилась с вашими требованиями.

Я в основном высокого уровня программирования приложений, так что я меньше беспокоюсь за представление, чем я о диапазоне. Даже так, мне иногда приходилось опускаться в двоичное представление, и его всегда укусил меня в задницу. Я помню, что писала какой-то код в начале '90-х, что пришлось бежать на классических ОС macOS, Windows 3.1 и Солярис. Я создал кучу перечисления, константы для 32-бит маски, который хорошо работал на Mac и Unix коробки, но не удалось скомпилировать на окне, потому что на Windows с инт был только 16-битные.

Комментарии (1)

C был разработан как язык, который может быть портирован на максимально широкий круг машин, как это возможно, а не как язык, который позволил большинству видов программы будут работать без модификации на такой ассортимент машин. Для большинства практических целей, с'ы типа:

  • 8-битный тип, если таковой имеется, или еще наименьший тип's по крайней мере 8 бит.

  • 16-битный тип, если таковой имеется, или же наименьший тип'ы не менее 16 бит.

  • 32-битный тип, если он доступен, или еще какой-то тип, что's по крайней мере 32 бита.

  • Тип которых будет 32 бита, если системы могут обрабатывать подобные вещи так же эффективно, как 16-бит, или 16 бит иначе.

Если код нужно 8, 16 или 32-битные типы и вряд ли можно было использовать на компьютерах, которые не поддерживают их, там'т никаких особых проблем с таким кодом по Чара, короткие и длинные как 8, 16 и 32 бита соответственно. Единственные системы, которые не'т сопоставить эти имена к этим типам будут те, которые не мог'т поддерживать эти типы и не'т быть в состоянии эффективно обрабатывать код, которым они требуются. Такие системы будут ограничиваться написанием кода, которые были написаны, чтобы быть совместимыми с типами, которые они используют.

Я думаю, может, возможно, лучше всего рассматривать, как рецепт для преобразования спецификации системы в диалектах языка. Система, которая использует 36-битной памяти выиграл't действительно быть в состоянии эффективно обрабатывать тот же диалект языка как системы, которые используют октет-памяти, но программист, который учится на одном диалекте смогли бы учиться, еще только узнав, что целочисленные представления последнего использования. Это'ы гораздо полезнее сказать программист должен написать код для 36-битной системе, "Эта машина как и другие машины, кроме как Чара - это 9 бит, "короткая" - это 18 бит, и "долго" - 36 бит" Ну, чем сказать "Вы должны использовать ассемблере потому что на других языках все требуют целочисленных типов эта система может'т процесс эффективно и".

Комментарии (4)

Не все машины имеют такой же родной размер слова. Хотя вы можете быть уговорены для того чтобы думать поменьше переменного размера будет более эффективным, это'т так. В самом деле, с помощью переменной, которая является такой же размер, как родной размер слова процессора гораздо быстрее, арифметические, логические и битовые операции.

Но что, собственно, в "родное слово размер и"? Почти всегда, это означает, что размер регистра процессора, который так же, как арифметико-логическое устройство (АЛУ) может работать.

Во встраиваемых средах, есть еще такие вещи, как 8 и 16-битных процессоров (есть еще 4-разрядных контроллеров пик?). Есть горы из 32-битных процессоров там еще. Так что понятие "и Родное слово размер на" жив и здоров для разработчиков.

С 64-разрядными процессорами, часто хорошая поддержка для 32-разрядных операндов. На практике, используя 32-битные целые числа и числа с плавающей точкой часто может быть быстрее, чем полный размер слова.

Кроме того, существуют компромиссы между родным словом выравнивание и общее потребление памяти при построении структур Си.

Но два общих тенденций использования остаются: агностик размер код для улучшения скорости (интервал, короткий, длинный), или фиксированный размер (int32_t, int16_t, int64_t) за правильность и взаимозаменяемости в случае необходимости.

Комментарии (11)