Ответ 1
Гарантируется, что перечисление будет представлено целым числом, но фактический тип (и его подпись) зависит от реализации.
Вы можете заставить перечисление быть представленным подшитым типом, указав один из счетчиков отрицательное значение:
enum SignedEnum { a = -1 };
В С++ 0x может быть явно указан базовый тип перечисления:
enum ShortEnum : short { a };
(С++ 0x также добавляет поддержку индексированных областей)
Для полноты я добавлю, что в языке программирования C, 2nd ed., перечисления указаны как имеющие тип int
(стр. 215). K & R не является стандартом C, поэтому он не является нормативным для компиляторов ISO C, но он предшествует стандарту ISO C, поэтому он по крайней мере интересен с исторической точки зрения.