как правило, под любое число выделяется int, и одновременно, практически каждый компилятор имеет опциональную возможность выделять под enum минимально возможный элемент, т.е. байт (если, конечно, перечисление содержит не более 256 элементов или не содержит элементов с явно заданными большими значениями).
для чего это нужно? снова понятно. язык Си слабо контролирует типы, стандарт С99 немного ужесточает контроль типов, но более-менее нормальный контроль есть только в С++. это означает, что когда в качестве параметра функции вы задаете тип-перечисление, компилятор может на этапе компиляции сообщить (обычно warning, но в С++ может быть и error), когда вы в функцию передаете число, не попадающее в перечисление - это немного помогает избежать грубых ошибок.
например, в WinAVR попробуйте скомпилировать оператор switch с аргументом перечисляемого типа - если вариантов case будет меньше, чем определено в перечислении, компилятор вам тут же сообщит, что не все варианты switch обработаны. для обычных типов чисел так он ругается только на отсутствие default.
но даже при полном отсутствии контроля типов в обычном Си человеческий фактор нельзя сбрасывать со счетов: абстрактный char практически ничего не скажет человеку-программисту, в то время как interrupt_mode уже содержит конкретный смысл, а взгляд на спрятанный за этим словом тип-перечисление сразу показывает допустимый диапазон значений.
P.S. я не в курсе, есть ли в каком-либо диалекте Си или С++ возможность определять "края" перечислений, как в Pascal... но это реально полезная фича!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!


