В большинстве реализаций я видел uint32_t
определяется как
typedef unsigned int uint32_t;
Но как я понимаю ints
являются не всегда гарантированно будет 4 байта во всех системах. Так что, если система имеет не 4-байтовые целые, как uint32_t
гарантия 4?
Реализация требуется для определения uint32_t
правильно (или не совсем, если это невозможно).
Если unsigned int
соответствует требованиям (ширина 32 бита, биты заполнения отсутствуют), реализация может определить его как
typedef unsigned int uint32_t;
Если это не так, но unsigned long
соответствует требованиям, он может быть определен как:
typedef unsigned long uint32_t;
Или он может использовать другой тип без знака, если это уместно.
<stdint.h>
Заголовок должен быть совместим с компилятором, с которым он используется. Если вы взяли <stdint.h>
заголовок, который безоговорочно определен uint32_t
как unsigned int
, и использовал его с компилятором, который делает unsigned int
16 битов, результатом будет несоответствующая реализация.
Совместимость может поддерживаться либо путем адаптации заголовка к компилятору, либо путем написания заголовка так, чтобы он адаптировался к характеристикам компилятора.
Как программист, вам не нужно беспокоиться о как правильность сохраняется (хотя, конечно, нет ничего плохого в том, чтобы быть любопытным). Вы можете положиться на то, что все сделано правильно, или вы можете пожаловаться поставщику на серьезную ошибку.
Каждая реализация C или C ++, которая определяет uint32_t
определяет это таким образом, что работает для этой реализации. Может использовать typedef unsigned int uint32_t;
только если unsigned int
удовлетворительно для uint32_t
в этой реализации.
Дело в том, что typedef unsigned int uint32_t;
появляется в <stdint.h>
в одной реализации C или C ++ не означает, что он появится в <stdint.h>
для любой другой реализации C или C ++. Реализация, в которой unsigned int
не подходили для uint32_t
придется предоставить другой <stdint.h>
, <stdint.h>
является частью реализации и изменяется при изменении реализации.
uint32_t
гарантия 32 бита?
Да.
Если CHAR_BIT == 16
, uint32_t
будет 2 «байта». «Байт» не всегда 8 бит в C.
Размер int
не является серьезной проблемой, касающейся реализации uintN_t
,
uintN_t
(N = 8,16,32,64) являются необязательными необязательными типами, которые существуют независимо, когда и если система может их поддерживать. Чаще всего их находят реализованными, особенно более крупные.
intN_t
также необязателен и должен быть дополнением 2.