C объявлений enum: есть ли совпадение перечислимых типов в зависимости от длины слова (32 или 64 бита), если их слишком много? - PullRequest
0 голосов
/ 27 апреля 2020

Я прохожу учебник по программированию в C и читаю об объявлении "enum".

В нем приведен пример использования enum для определения нескольких флагов стилей текста.

https://www.programiz.com/c-programming/c-enumeration

Указывает, что использование побитового оператора ИЛИ "|" является средством определения одним словом, какими могут быть комбинированные стили текста.

Мой вопрос: не будет ли совпадений, если бы это был единственный способ объединить флаги стиля, если в перечислении использовалось слишком много флагов?

Например, если у меня есть только 8-битный компьютер, и я выдаю объявление enum, например

enum exampleFlag {
        style1 = 1
        style2 = 2
        style3 = 4
        style4 = 8
        style5 = 16
        style6 = 32
        style7 = 64
        style8 = 128
        style9 = 255
};
    int main() {
        int myDesign = style9 | style1; 

            //    00000001
            //  | 11111111
            //  ___________
            //    11111111

        printf("%d", myDesign);

        return 0;
    }

OUTPUT

255

И затем я хочу проверить каков стиль для текста, но тогда style9 является эквивалентом для всех стилей, действующих одновременно, так что тогда ... не вызывает ли это проблемы?

Учебное пособие не собирается go до глубины души, но я хотел задать этот вопрос, поскольку мне кажется, что способ, которым это работает, вызовет частичное совпадение стилей, если числа будут выбраны неправильно при объявлении перечисления.

Но, возможно, Я неправильно понимаю, как действительно работает декларация enum.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Каждый бит может иметь только одно из двух возможных значений: 0 или 1. Если вы используете биты в качестве отдельных «флагов» включения / выключения, то для каждого флага требуется выделенный бит, т. Е. У вас не может быть больше флагов, чем у вас есть биты , Это применяется повсеместно, независимо от языка программирования.

Однако это не означает, что размер слова вашей машины ограничивает количество флагов, которые вы можете иметь: вы можете просто использовать более одного слова (например, на 32-битная машина, у вас может быть массив 32-битных целых чисел, к которому вы обращаетесь, например flags[n / 32] & (1 << (n % 32))). Конечно, это означает дополнительные накладные расходы, и флаги становится труднее передать.

Между тем, я думаю, что довольно редко встречается большое количество связанных, но независимых флагов. Если все флаги не относятся к одной и той же вещи, они должны храниться отдельно (например, style_flags и state_flags).

И если флаги не являются взаимоисключающими, возможно, вам следует Вместо этого перечислите различные комбинации, в этом случае вместо n флагов у вас есть 2 n различных случаев. Например, вместо флагов, таких как bold, light и semibold, вы могли бы иметь weight в качестве числа или style в качестве перечисляемого набора случаев).

0 голосов
/ 27 апреля 2020

Из комментариев я смог подтвердить свои подозрения в отношении объявления enum.

Чтобы не было совпадений при любой длине слова, которое используется архитектурой (32-битная или 64-битная) или любой другой бит) вы не можете объявлять больше флагов, чем битов в длине слова. Кроме того, каждый флаг в перечислении должен быть включен в диапазон 2 ^ n, где n находится в диапазоне от 0 до длины слова (32 бита или 64 бита).

Это перечисление необходимо только до тех пор, пока вы ожидаете использовать одну переменную для хранения нескольких флагов с помощью побитового оператора ИЛИ "|". Поскольку побитовый оператор ИЛИ сможет различать guish только между уникальными состояниями, которые не могут быть получены путем сложения их вместе, как показано в исходном вопросе.

Это полезно при наличии стилей для текст, такой как жирный, курсив и подчеркнутый. В одной переменной вы можете определить, имеет ли она один или любой из этих стилей, если их перечисление следует шаблону 2 ^ n для каждого стиля.

Объявление enum по умолчанию, однако, не позволяет переменной хранить одновременно что-либо, кроме одного флага, из-за этой проблемы перекрытия, которая может возникнуть из-за их числового эквивалента. Однако можно сохранить до «n» числа состояний, которое соответствует длине слова архитектуры, как было указано ранее, в одной переменной, если вы следуете шаблону для этого использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...