Когда uint8 t ≠ unsigned char?
согласно C и C++,CHAR_BIT >= 8.
Но всякий раз CHAR_BIT > 8,uint8_t даже не может быть представлено в виде 8 бит.
Он должен быть больше, потому что CHAR_BIT - минимальное количество битов для любого типа данных в системе.
на какой системе можно uint8_t юридически определяется как тип, отличный от unsigned char?
(если ответ отличается для C и C++, то я хотел бы знать оба.)
3 ответов:
если он существует,
uint8_tдолжна всегда иметь ту же ширину, что иunsigned char. Однако это не обязательно должен быть один и тот же тип; это может быть отдельный расширенный целочисленный тип. Он также не должен иметь такое же представление, какunsigned char; например, биты могут быть интерпретированы в обратном порядке. Это глупый пример, но он имеет больше смысла дляint8_t, гдеsigned charмогут быть те, которые дополняют или знак-величина в то время какint8_tтребуется twos дополняют.еще один "преимущество" использования расширенного целочисленного типа без символа для
uint8_tдаже в "нормальных" системах есть правила сглаживания C. Символьные типы разрешены для псевдонимов, что предотвращает компилятор от значительной оптимизации функций, которые используют как указатели символов, так и указатели на другие типы, если толькоrestrictключевое слово было применено хорошо. Однако, даже еслиuint8_tимеет точно такой же размер и представительства какunsigned char, если реализация сделала его отличным, не символьным типом, сглаживание правила к нему не применялись бы, и компилятор мог бы предположить, что объекты типовuint8_tиint, например, никогда не псевдоним.
на какой системе можно
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 без знака char, или подписанный char, (или его квалифицированная версия) результатом является 1. ...
таким образом, это (некоторые из) Самые маленькие адресуемые единицы. Очевидно
int8_tиuint8_tможно также считать наименьшими адресными единицами, если они существуют.7.20.1.1 целочисленные типы точной ширины
1 на определение типа intN_t имя обозначает тип знакового целого числа с шириной N, никаких бит заполнения и представление дополнения двух. Таким образом, int8_t обозначает такой знаковый целочисленный тип с ширина ровно 8 биты.
2 имя typedef uintN_t обозначает беззнаковый целочисленный тип с ширина N и отсутствие битов прокладки. Таким образом, uint24_t обозначает такое беззнаковое значение целочисленный тип с шириной ровно 24 бита.
3 эти типы являются необязательными. однако, если реализация обеспечивает целочисленные типы с шириной 8, 16, 32 или 64 бит, без заполнения битов, и (для подписанных типов), которые имеют два дополнения представительство, оно должно определить соответствующие имена typedef.
акцент на "эти типы являются необязательными" мой. Я надеюсь, что это было полезно :)
возможность, о которой до сих пор никто не упоминал: если
CHAR_BIT==8и неквалифицированныхcharбез знака, который он находится в некоторых ABIs, тоuint8_tможет быть typedef дляcharвместоunsigned char. Это имеет значение, по крайней мере, в той мере, в какой это влияет на выбор перегрузки (и его злого близнеца, имя mangling), т. е. если вы должны были иметь обаfoo(char)иfoo(unsigned char)в области видимости, вызываяfooС аргументом типаuint8_tпредпочитаюfoo(char)на такой системе.
Comments