Как uint32_t гарантирует 32 бита?

В большинстве реализаций я видел uint32_t определяется как

typedef unsigned int uint32_t;

Но как я понимаю ints являются не всегда гарантированно будет 4 байта во всех системах. Так что, если система имеет не 4-байтовые целые, как uint32_t гарантия 4?

1

Решение

Реализация требуется для определения 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 битов, результатом будет несоответствующая реализация.

Совместимость может поддерживаться либо путем адаптации заголовка к компилятору, либо путем написания заголовка так, чтобы он адаптировался к характеристикам компилятора.

Как программист, вам не нужно беспокоиться о как правильность сохраняется (хотя, конечно, нет ничего плохого в том, чтобы быть любопытным). Вы можете положиться на то, что все сделано правильно, или вы можете пожаловаться поставщику на серьезную ошибку.

6

Другие решения

Каждая реализация 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> является частью реализации и изменяется при изменении реализации.

2

uint32_t гарантия 32 бита?

Да.


Если CHAR_BIT == 16, uint32_t будет 2 «байта». «Байт» не всегда 8 бит в C.

Размер int не является серьезной проблемой, касающейся реализации uintN_t,

uintN_t (N = 8,16,32,64) являются необязательными необязательными типами, которые существуют независимо, когда и если система может их поддерживать. Чаще всего их находят реализованными, особенно более крупные.

intN_t также необязателен и должен быть дополнением 2.

1
По вопросам рекламы [email protected]