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

Почему компиляторы C указывают, что длинный 32-битный и длинный, чтобы быть 64-битным?

Разве не имело бы смысла делать длинный 64-битный и зарезервировать долгое время, пока 128-битные числа не станут реальностью?

4b9b3361

Ответ 1

Да, это имеет смысл, но у Microsoft были свои причины для определения "длинных", как 32-разрядных.

Насколько мне известно, из всех основных систем прямо сейчас Windows - единственная ОС, где "long" - 32 бит. В Unix и Linux 64-разрядная версия.

Все компиляторы для Windows будут компилировать "длинные" в 32-разрядные версии Windows для обеспечения совместимости с Microsoft.

По этой причине я избегаю использования "int" и "long". Иногда я использую "int" для кодов ошибок и booleans (в C), но я никогда не использую их для какого-либо кода, зависящего от размера типа.

Ответ 2

В стандарте c НЕ указывается длина бит примитивного типа данных, но только минимальная длина бит. Таким образом, компиляторы могут иметь опции на битовой длине примитивных типов данных. При определении длины бит каждого примитивного типа данных разработчик компилятора должен учитывать несколько факторов, включая компьютерную архитектуру.

вот несколько ссылок: http://en.wikipedia.org/wiki/C_syntax#Primitive_data_types

Ответ 3

По историческим причинам. В течение долгого времени (каламбур), "int" означал 16-бит; следовательно, "длинный" как 32-битный. Конечно, времена изменились. Следовательно, "длинный длинный":)

PS:

GCC (и другие) в настоящее время поддерживают 128-битные целые числа как "(u) int128_t".

PPS:

Здесь обсуждалось, почему люди в GCC принимали решения, которые они сделали:

http://www.x86-64.org/pipermail/discuss/2005-August/006412.html

Ответ 4

C99 N1256 стандартный проект

Размеры long и long long - это реализация, все, что мы знаем:

  • гарантии минимального размера
  • относительные размеры между типами

5.2.4.2.1 Размеры целочисленных типов <limits.h> дают минимальные размеры:

1 [...] Их значения, определяемые реализацией, должны быть равны или больше по величине (по абсолютной величине) показанным [...]

  • UCHAR_MAX 255//2 8 - 1
  • USHRT_MAX 65535//2 16 - 1
  • UINT_MAX 65535//2 16 - 1
  • ULONG_MAX 4294967295//2 32 - 1
  • ULLONG_MAX 18446744073709551615//2 64 - 1

6.2.5 Типы затем говорят:

8 Для любых двух целых типов с одинаковой степенью соответствия и разного целочисленного преобразования (см. 6.3.1.1), диапазон значений типа с меньшим целым числом ранга преобразования равен поддиапазон значений другого типа.

и 6.3.1.1 Булевы, символы и целые числа определяют относительные числа рангов:

1 Каждый целочисленный тип имеет целочисленный ранг преобразования, определяемый следующим образом:

  • Ранг long long int должен быть больше ранга long int, который должен быть больше ранга int, который должен быть больше ранга короткого int, который должен быть больше ранга подписанного char.
  • Ранг любого беззнакового целочисленного типа должен быть равен рангам соответствующего значный целочисленный тип, если он есть.
  • Для всех целых типов T1, T2 и T3, если T1 имеет больший ранг, чем T2, а T2 имеет больший ранг, чем T3, то T1 имеет больший ранг, чем T3

Ответ 5

С момента создания первого компилятора C для универсального перепрограммируемого микрокомпьютера часто необходимо, чтобы код использовал типы, которые содержали ровно 8, 16 или 32 бита, но до 1999 года Standard didn ' t явно предоставляет какой-либо способ для программ указывать это. С другой стороны, почти все компиляторы для 8-битных, 16-битных и 32-разрядных микрокомпьютеров определяют "char" как 8 бит, "короткий" как 16 бит, а "long" - 32 бита. Единственное различие между ними "int" - 16 бит или 32.

В то время как 32-разрядный или более крупный процессор мог использовать "int" как 32-битный тип, оставив "длинный", доступный как 64-битный тип, существует существенный корпус кода, который ожидает что "long" будет 32 бит. Хотя в стандарте C добавлены типы "фиксированного размера" в 1999 году в Стандарте есть другие места, которые по-прежнему используют "int" и "long" , например "printf". Хотя C99 добавил макросы для обеспечения правильного формата спецификаторов для целочисленных типов фиксированного размера, существует существенный который ожидает, что "% ld" является допустимым спецификатором формата для int32_t, поскольку он будет работать практически на любой 8-битной, 16-разрядной или 32-битной платформе.

Имеет ли смысл иметь "длинный" 32 бита из-за уважения к существующая база кода возвращается к десятилетиям или 64 бит, чтобы избежать необходимости более подробные "long long" или "int64_t" для идентификации 64-битных типов вероятно, решение суда, но с учетом того, что новый код должен, вероятно, использование типов определенного размера, когда это практично, я не уверен, что вижу убедительные преимущество в создании "длинных" 64 бит, если "int" также не является 64 битами (что будет создавать еще большие проблемы с существующим кодом).