Перечисление на 8 битов, в C

ctrl + является специальным ключом.

ctrl + d - [d] etach, оставьте программы (irssi?) в фоне, пойти домой.

ctrl + c [c] повторно съел новое окно ctrl + 0-9 , переключатель между окнами номером

экранирует-r - возвращаются к отдельной сессии

, Который покрывает 90% вариантов использования. Не пытайтесь показать всю функциональность в единственное время.

24
задан Lyndon White 24 July 2014 в 01:20
поделиться

5 ответов

gcc -fshort-enums могут быть полезны:

Присваивать типу "enum" только как столько байтов, сколько нужно для заявленный диапазон возможных значений. В частности, тип "перечисление" будет эквивалентно наименьший целочисленный тип, в котором достаточно места.

Фактически, здесь - это страница с большим количеством важной информации. Надеюсь, вы встретите много переключателей GCC, о существовании которых вы даже не подозревали. ;)

36
ответ дан 28 November 2019 в 23:21
поделиться

Я не понимаю, почему перечисление не работает. Все сравнения и назначения из перечисления должны нормально работать с расширением по умолчанию. Просто будьте осторожны, чтобы ваши 8-битные значения были правильно подписаны (я думаю, вам нужно беззнаковое расширение).

Таким образом вы получите 16-битные сравнения, я надеюсь, что это не будет проблемой производительности (не должно быть, особенно если ваш процессор 16-битный, как кажется).

3
ответ дан 28 November 2019 в 23:21
поделиться

Компилятор Microsoft C позволяет делать что-то вроде этого, но это расширение (стандартно для C ++ 0x):

enum Foo : unsigned char {
    blah = 0,
    blargh = 1
};

Поскольку вы отметили GCC, я не совсем уверен, что то же самое возможно, но GCC может иметь расширение в режиме gnu99 или что-то в этом роде. Дайте ему кружиться.

1
ответ дан 28 November 2019 в 23:21
поделиться

Я бы рекомендовал в любом случае оставаться на enum по следующим причинам:

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

Сначала вы не должны заботиться о реальной ширине шрифта. Только если вам действительно нужен эффективный способ хранения, вы должны использовать флаги компилятора, такие как -fshort-enums в компиляторе GNU, но я не рекомендую их, если они вам действительно не нужны.

В качестве последнего варианта вы можете определить 'enum' в качестве данных представления для команд и использовать преобразование в байт с помощью двух простых операций для сохранения / восстановления значения команды в / из памяти (и инкапсулировать это в одном месте). Как насчет этого? Это очень простые операции, поэтому вы можете даже встроить их (но это позволяет вам действительно использовать только 1 байт для хранения и с другой стороны для выполнения операций с использованием наиболее удобного перечисления, определенного как вам нравится.

0
ответ дан 28 November 2019 в 23:21
поделиться

Вы пытаетесь решить проблему, которой не существует.

Ваш вопрос помечен тегом C. В языке C типы перечислений в контексте значений полностью совместимы с целочисленными типами и ведут себя так же, как другие целые типы. Когда они используются в выражениях, они подвергаются точно таким же интегральным преобразованиям, что и другие интегральные типы. Приняв это во внимание, вы должны понимать, что если вы хотите сохранить значения, описанные константами перечисления, в 8-битном целочисленном типе, все, что вам нужно сделать, это выбрать подходящий общий 8-битный интегральный тип (скажем, int8_t ) и используйте его вместо типа перечисления. Вы ничего не потеряете, сохранив значения констант перечисления в объекте типа int8_t (в отличие от объекта, явно объявленного с типом перечисления).

Проблема, которую вы описываете, может существовать в C ++, где типы перечислений отделены гораздо дальше от других целочисленных типов. В C ++ использование целочисленного типа вместо типа перечисления с целью экономии памяти более затруднительно (хотя и возможно). Но не в C, где это не требует никаких дополнительных усилий.

7
ответ дан 28 November 2019 в 23:21
поделиться
Другие вопросы по тегам:

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