Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zakres wartości typów wyliczeniowych

Ostatnio zmodyfikowano 2014-04-12 19:00
Autor Wiadomość
MTPR
Temat założony przez niniejszego użytkownika
Zakres wartości typów wyliczeniowych
» 2014-04-11 21:56:45
Witam,
przykładowo kolejne wartości enumeratorów to: 1, 2, -5, 6. Występuje wartość ujemna, z książki dowiaduję się że zakres
dla takich wartości wynosiłby( po moim obliczeniu ) od -7 do 7 ( dobrze policzyłem ? ) co daje zakres 15 liczb.
Zmiennej wyliczeniowej tego samego typu możemy przypisywać dowolną wartość całkowitą z tego zakresu.
Więc dlaczego przy tych wartościach mogę przypisywać liczby dużo większe ? ( Enumeratory te są typu int ).
Napisane jest również, że zakres ten służy do wyznaczania przez kompilator[używam C::B] potrzebnego miejsca na wartości wyliczeniowe. 15 liczb to ponad 3 bity ale mniej od 4, ( więc ile ? ) jak to rozumieć ?

Przejrzałem wiele stron/kursów opisujących typu wyliczeniowe i na żadnym z nich nie było nic na temat zakresu wartości.
Jedynie na jednym z forów ktoś napisał, że kompilator mimo wyznaczonego zakresu i tak zwiększy rozmiar do rozmiaru używanego typu czyli int. Co faktycznie potwierdza zwracana wartość przez sizeof, jednak jaki wtedy miałby sens taki zakres ?
P-108049
f651144
» 2014-04-12 18:45:02
Nie za bardzo rozumiem jak komputer (x86) miał by sobie "stworzyć" zmienną o rozmiarze 3 bitów... Chyba nie do końca rozumiesz o co chodzi z typami wyliczeniowymi.

PS: C::B to nie kompilator, tylko IDE. Prawdopodobnie (domyślne ustawienie) używasz MinGW <- ta wiedza może Ci się przydać w przyszłości XD.
P-108068
Monika90
» 2014-04-12 19:00:44
od -7 do 7 ( dobrze policzyłem ? ) co daje zakres 15 liczb.
W typowej implementacji używającej kodu uzupełnienia do 2, to będzie od -8 do 7, czyli 4 bity. W innych implementacjach (znak-moduł, uzupełnienie do 1) to będzie -7 do 7, czyli też 4 bity (bo są dwa zera dodatnie i ujemne)

Enumeratory te są typu int ).
Nie są. Każda enumeracja ma swój własny odrębny typ. Natomiast typ całkowitoliczbowy używany przez implementację do przechowywania enumów (tzw. underlying type) zależy od kompilatora i może to być int. Jak ci się nie podoba, to możesz sobie zmienić na inny.
P-108071
« 1 »
  Strona 1 z 1