Zakres wartości typów wyliczeniowych
Ostatnio zmodyfikowano 2014-04-12 19:00
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 ? |
|
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. |
|
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. |
|
« 1 » |