Страницы

Поиск по вопросам

четверг, 4 октября 2018 г.

Язык C, что говорит Стандарт о размере байта

Подскажите, как Стандарты регламентируют размер байта?
Я где-то слышал, что в C принято соглашение, согласно которому байт может быть только 8-ми битным. Но не могу найти источник.
Многие привыкли оперировать с байтами, используя char и CHAR_BIT, но ведь char бывает не только 8-ми битным.
CHAR_BIT тоже вводит в заблуждение, ведь эта макро-константа, вроде бы, не имеет никакого отношения к размеру байта, она относится к битности типа char
Часто возникает необходимость навигации по памяти/объектам через void*, именно побайтово. Кто-то использует для этого приведение к char*, но это, очевидно, неправильно. Я, например, использую приведение к uint8_t*, но это, наверняка, тоже неправильно.


Ответ

Я нигде не видел соглашения о 8 битах на байт в си. Но откроем стандарт с11 - это конечно не сам стандарт, но документ, который очень близок к нему.
пункт 6.2.6 Representations of types дает следующее
Values stored in non-bit-field objects of any other object type consist of n × CHAR_BIT bits, where n is the size of an object of that type, in bytes. The value may be copied into an object of type unsigned char [n] (e.g., by memcpy);
здесь немного неявно говорится что n × CHAR_BIT bits == n байт. То есть CHAR_BIT bits это один байт.
При этом пунк 3.6 говорит
byte addressable unit of data storage large enough to hold any member of the basic character set of the execution environment
то есть, байт - достаточно, что бы вместить любой символьный тип. мда...
NOTE 1 It is possible to express the address of each individual byte of an object uniquely.
байт должен иметь уникальный адрес
NOTE 2 A byte is composed of a contiguous sequence of bits, the number of which is implementation defined.
а тут самое оно - кол-во бит определяется имплементацией.
Пункт 5.2.4.2 Numerical limits говорит, что CHAR_BIT как минимум 8 или больше.
Что же делать? Добавить в систему сборки проверку CHAR_BIT == 8 и спать спокойно: платформа скорее всего x86/64, использовать void* и char, 'memcpy'/'memmove' функции можно, все будет работать.
А вот когда условие не сработает, тогда и начинать поднимать панику и просить документацию к компилятору.
Вот здесь говорят, что не восьмибитным может быть на
Texas Instruments C54x DSPs (OMAP2) (16 бит) Digital Equipment Corporation PDP-6/10 (36 бит) IBM 701/704/709/7090/7094 (36 бит) UNIVAC 1103/1103A/1105/1100/2200 (36 бит)

Комментариев нет:

Отправить комментарий