Как можеттипы гарантируют ширину бита? - PullRequest
1 голос
/ 02 ноября 2019

Поскольку C является свободно типизированным языком, а stdint.h определяет только typedefs (я полагаю), как можно гарантировать ширину целых чисел?

То, что я спрашиваю, касается реализации, а неиспользование библиотеки.

Ответы [ 3 ]

2 голосов
/ 02 ноября 2019

Как <stdint.h> типы могут гарантировать битовую ширину?

C не может и C не требует этого.

C требует минимальная ширина.


Ниже, индивидуальность, требуются только в системах, которые их поддерживают, без дополнения и дополнения 2 для типов знаков.

(u)int8_t, (u)int16_t, (u)int32_t, (u)int64_t

Реализация может дополнительно иметь другие размеры, такие как uint24_t

Ниже требуется.

(u)int_least8_t, (u)int_least16_t, (u)int_least32_t, (u)int_least64_t
2 голосов
/ 02 ноября 2019

stdint.h является частью реализации C, которая определяет typedef с использованием любых базовых типов, подходящих для этой реализации . Это не переносимый файл, который вы можете перенести в любую понравившуюся вам реализацию на C.

1 голос
/ 12 ноября 2019

Компилятор переменного тока в конечном итоге должен компилироваться в машинный код. Машинный код имеет только жесткие типы с фиксированной шириной, такие как 32-разрядное целое, 64-разрядное целое и т. Д. (Или, скорее, он имеет блоки памяти такого размера + операции, которые работают с памятью такого размера и обрабатывают его как подписанный илиunsigned)

Так что люди, которые создают ваш компилятор, определяют, что на самом деле использует ваш компилятор, когда вы запрашиваете у него int, а заголовочный файл stdint.h - это файл, который они пишут,Это в основном документация того, что они сделали. Они знают, что, например, их тип long имеет размер 64 бита, поэтому добавьте typedef long int64_t; и т. Д.

В системе, где int составляет 16 бит, а long составляет 32 бита, они могут дажепусть их компилятор поймет специальный внутренний тип и, например, назовет его __int64, а затем заставит stdint.h содержать typedef __int64 int64_t;.

Стандарт C просто определяет, что должен быть заголовок stdint.h, предоставленныйваш компилятор, и что если вы определите int64_t там, он должен сопоставиться с типом данных, который имеет правильный размер.

Теоретически можно просто встроить все в stdint.hвместо этого в компилятор (поэтому вместо использования промежуточного имени, такого как __int64 и определения его типа в int64_t, они могут просто использовать int64_t напрямую, но при использовании этого подхода существовал старый код, который был написан до stdint.h, иОпределенный их собственный тип с именем int64_t может просто не включать stdint и, таким образом, будет продолжать компиляцию. Имена, начинающиеся с двух подчеркиваний, исторически были зарезервированы для производителя компилятора, поэтому шансов на существование не существует. код Ting C, используя имя __int64 уже.

...