Тип, используемый для представления байта в ANSI (C89 / 90) C?

StackOverflow https://stackoverflow.com/questions/437470

  •  22-07-2019
  •  | 
  •  

Вопрос

Существует ли метод жалобы о соответствии стандартам для представления байта в ANSI (C89 / 90) C? Я знаю, что чаще всего символ является байтом, но я понимаю, что это не гарантируется. Кроме того, в стандарте C99 есть stdint.h, но что использовалось до C99?

Мне интересно как конкретно 8 бит, так и "байт" (sizeof (x) == 1).

Это было полезно?

Решение

char всегда является байтом , но это не всегда октет . Байт - это наименьшая адресуемая единица памяти (в большинстве определений), октет - это 8-битная единица памяти.

То есть sizeof (char) всегда 1 для всех реализаций, но макрос CHAR_BIT в limit.h определяет размер байта для платформы, и он не всегда 8 бит. Существуют платформы с 16-битными и 32-битными байтами, поэтому char будет занимать больше битов, но это все еще байт. Поскольку требуемый диапазон для char составляет по крайней мере от -127 до 127 (или от 0 до 255), он будет как минимум 8 бит на всех платформах.

  

ISO / IEC 9899: TC3

     

6.5.3.4 Оператор sizeof

     <Ол>   
  • ...
  •   
  • Оператор sizeof возвращает размер ( в байтах ) своего операнда, который может быть выражением или именем типа в скобках. [...]
  •   
  • При применении к операнду с типом char , unsigned char или signature char , (или квалифицированной версией & # 64257; ed) из этого) результат 1 . [...]
  •   

    Акцент мой.

    Другие советы

    Вы всегда можете представить байт (если вы имеете в виду 8 бит) в неподписанном символе. Он всегда имеет размер не менее 8 бит, все биты составляют значение, поэтому 8-битное значение всегда будет соответствовать ему.

    Если вы хотите ровно 8 бит, я также думаю, что вам придется использовать зависящие от платформы способы. Похоже, что системы POSIX необходимы для поддержки int8_t. Это означает, что в системах POSIX символ (и, следовательно, байт) всегда равен 8 битам.

    В ANSI C89 / ISO C90 sizeof (char) == 1. Однако не всегда так, что 1 байт равен 8 битам. Если вы хотите посчитать количество бит в 1 байте (и у вас нет доступа к limit.h), я предлагаю следующее:

    unsigned int bitnum(void) {
        unsigned char c = ~0u; /* Thank you Jonathan. */
        unsigned int v;
    
        for(v = 0u; c; ++v)
            c &= c - 1u;
        return(v);
    }
    

    Здесь мы используем метод Кернигана для подсчета количества битов, установленных в c . Чтобы лучше понять приведенный выше код (или увидеть другие подобные), я отсылаю вас к " Битовые хаки ".

    До C99? Платформо-зависимый код.

    Но почему тебя это волнует? Просто используйте stdint.h.

    В каждой реализации C, которую я использовал (от старой UNIX до встроенных компиляторов, написанных аппаратными инженерами для компиляторов крупных поставщиков), char всегда был 8-разрядным.

    Вы можете найти довольно надежные макросы и определения типов в boost.

    Я заметил, что некоторые из ответивших переопределили слово байт, чтобы обозначать что-то отличное от 8 бит. Байт равен 8 битам, однако в некоторых реализациях c символ представляет собой 16 бит (2 байта) или 8 бит (1 байт). Люди, которые называют байт «наименьшей адресуемой единицей памяти» или что-то в этом роде, потеряли понимание значения байта (8 бит). Причина того, что некоторые реализации C имеют 16-битные символы (2 байта), а некоторые имеют 8-битные символы (1 байт), и нет стандартного типа с именем 'byte', вызвана ленью.

    Итак, мы должны использовать int_8

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top