Когда uint8 t ≠ unsigned char?



согласно C и C++,CHAR_BIT >= 8.

Но всякий раз CHAR_BIT > 8,uint8_t даже не может быть представлено в виде 8 бит.

Он должен быть больше, потому что CHAR_BIT - минимальное количество битов для любого типа данных в системе.



на какой системе можно uint8_t юридически определяется как тип, отличный от unsigned char?



(если ответ отличается для C и C++, то я хотел бы знать оба.)

686   3  

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

    Ничего не найдено.