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