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

33
задан James McNellis 20 June 2010 в 03:40
поделиться

5 ответов

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

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

ISO/IEC 9899:TC3

6.5.3.4 sizeof оператор

  1. ...
  2. sizeof оператор приводит к размеру ( в байтах ) его операнда, который может быть выражением или заключенным в скобки названием типа. [...]
  3. , Когда относится операнд, который имеет тип char, unsigned char, или signed char, (или qualiп¬Ѓed версия этого) результат, 1 . [...]

шахта Emphasis.

63
ответ дан 27 November 2019 в 18:02
поделиться

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

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

9
ответ дан 27 November 2019 в 18:02
поделиться

В ANSI C89/ISO C90 sizeof (символ) == 1. Однако не всегда имеет место, что 1 байт составляет 8 битов. Если Вы хотите считать число битов в 1 байте (и у Вас нет доступа к limits.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);
}

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

3
ответ дан 27 November 2019 в 18:02
поделиться

Перед C99? Зависимый от платформы код.

, Но почему Вы заботитесь? Просто используйте stdint.h.

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

1
ответ дан 27 November 2019 в 18:02
поделиться

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

-2
ответ дан 27 November 2019 в 18:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: