На каком типе системы uint8_t
может быть юридически определен как тип, отличный от unsigned char
?
Таким образом, uint8_t
может быть юридически определен только в системах, где CHAR_BIT
равно 8. Это адресуемая единица с ровно 8 битами значений и без битов заполнения.
Подробно CHAR_BIT
определяет ширину наименьших адресуемых единиц, а uint8_t
не может иметь битов заполнения; он может существовать только тогда, когда наименьшая адресуемая единица имеет ширину ровно 8 бит. Если CHAR_BIT
равно 8, uint8_t
может быть определен определением типа для любого 8-битового целочисленного типа без знака, который не имеет битов заполнения.
Вот что говорится в стандартном проекте C11 (n1570.pdf):
5.2.4.2.1 Размеры целочисленных типов 1 Приведенные ниже значения должны быть заменены константными выражениями, подходящими для использования в директивах предварительной обработки #if. ... Их значения, определяемые реализацией, должны быть равны или больше по величине (абсолютному значению) показанным с тем же знаком.
-- number of bits for smallest object that is not a bit-field (byte)
CHAR_BIT 8
Таким образом, самые маленькие объекты должны содержать ровно биты CHAR_BIT.
6.5.3.4 Операторы sizeof и _Alignof
...
4 Когда sizeof применяется к операнду, имеющему тип char, unsigned char или signed char (или их квалифицированную версию), результат будет 1. ...
Таким образом, это (некоторые из) наименьшие адресуемые устройства. Очевидно, что int8_t
и uint8_t
также могут считаться наименьшими адресуемыми блоками, если они существуют.
7.20.1.1 Целочисленные типы точной ширины
1 Имя typedef intN_t обозначает целочисленный тип со знаком шириной N, без битов заполнения и представление с дополнением до двух. Таким образом, int8_t обозначает такой знаковый целочисленный тип шириной ровно 8 бит.
2 Имя typedef uintN_t обозначает беззнаковый целочисленный тип с шириной N и без битов заполнения. Таким образом, uint24_t обозначает такой беззнаковый целочисленный тип шириной ровно 24 бита.
3 Эти типы не являются обязательными. Однако, если реализация предоставляет целочисленные типы с шириной 8, 16, 32 или 64 бит, без битов заполнения и (для типов со знаком), которые имеют дополнение до двух представление, оно должно определять соответствующие имена typedef.
Я делаю акцент на «Эти типы необязательны». Я надеюсь, что это было полезно :)
person
autistic
schedule
22.04.2013
char
только с 7 реальными битами и 1 битом заполнения. - person Mysticial   schedule 22.04.2013char
s должны иметь все биты представления, участвующие в определении их значения. - person user541686   schedule 22.04.2013uint8_t
, где 8 - действительное значение, а 8 - заполнение. Я бы выстрелил в любого, кто создал такую среду. :) - person Mysticial   schedule 22.04.2013typedef signed integer type int8_t; // optional
- person Rapptz   schedule 22.04.2013char
. - person   schedule 22.04.2013uint8_t
вообще не должно существовать. - person Mike Seymour   schedule 25.04.2013