Czy zmienna typu Integer w C zajmuje 2 bajty czy 4 bajty?
To zależy od używanej platformy, a także od konfiguracji kompilatora. Jedyną miarodajną odpowiedzią jest użycie sizeof
operatora, aby zobaczyć, jak duża jest liczba całkowita w konkretnej sytuacji.
Od jakich czynników to zależy?
Najlepiej rozważyć zasięg , a nie rozmiar . Oba będą się różnić w praktyce, chociaż, jak zobaczymy, znacznie bardziej niezawodnym jest wybieranie typów zmiennych według zakresu niż rozmiaru. Należy również zauważyć, że standard zachęca nas do rozważenia wyboru typów liczb całkowitych na podstawie zakresu a nie rozmiar , ale na razie zignorujmy standardową praktykę i pozwól naszej ciekawości zbadać sizeof
, bajty i CHAR_BIT
reprezentacje liczb całkowitych ... królicza nora i zobacz to na własne oczy ...
sizeof
, bajty i CHAR_BIT
Poniższe stwierdzenie, zaczerpnięte ze standardu C (do którego link znajduje się powyżej), opisuje to słowami, których nie sądzę, aby można było poprawić.
sizeof
Operator uzyskuje rozmiar (w bajtach) jej argumentu operacji, który może być ekspresja lub nawiasach nazwa typu. Rozmiar jest określany na podstawie typu operandu.
Zakładając, że jasne zrozumienie doprowadzi nas do dyskusji na temat bajtów . W rzeczywistości przyjmuje się, że bajt to osiem bitówCHAR_BIT
mówi ci, ile bitów jest w bajcie . To tylko kolejny z tych niuansów, których nie bierze się pod uwagę, gdy mówimy o typowych dwu- (lub czterobajtowych) liczbach całkowitych .
Podsumujmy do tej pory:
sizeof
=> rozmiar w bajtach i
CHAR_BIT
=> liczba bitów w bajcie
Tak więc, w zależności od systemu, sizeof (unsigned int)
może to być dowolna wartość większa od zera (nie tylko 2 lub 4), jak gdyby wynosiła CHAR_BIT
16, wtedy pojedynczy (szesnastobitowy) bajt ma wystarczającą liczbę bitów, aby reprezentować szesnastobitową liczbę całkowitą opisaną przez norm (cytowane poniżej). To niekoniecznie przydatne informacje, prawda? Zanurzmy się głębiej ...
Reprezentacja liczb całkowitych
Ç Określono minimalne dokładności / zakres dla standardowych typów całkowitych (a CHAR_BIT
, także FWIW) tutaj . Na tej podstawie możemy wyliczyć minimalną liczbę bitów potrzebnych do przechowywania wartości , ale równie dobrze możemy po prostu wybrać nasze zmienne na podstawie zakresów . Niemniej jednak ogromna część szczegółów wymaganych dla tej odpowiedzi znajduje się tutaj. Na przykład następujące, które standard unsigned int
wymaga (co najmniej) szesnastu bitów pamięci:
UINT_MAX 65535 // 2¹⁶ - 1
W ten sposób widzimy, że unsigned int
wymaga ( co najmniej ) 16 bitów , czyli tam, gdzie otrzymujesz dwa bajty (zakładając, że CHAR_BIT
jest to 8) ... a później, gdy limit wzrósł do 2³² - 1
, ludzie podawali zamiast tego 4 bajty. To wyjaśnia obserwowane przez Ciebie zjawiska:
Większość podręczników mówi, że zmienne całkowite zajmują 2 bajty. Ale kiedy uruchamiam program wyświetlający kolejne adresy tablicy liczb całkowitych, pokazuje różnicę 4.
Używasz starożytnego podręcznika i kompilatora, który uczy cię nieprzenośnego języka C; autor, który napisał twój podręcznik, może nawet nie być tego świadomy CHAR_BIT
. Ci powinni uaktualnić swój podręcznik (i kompilatora), i staramy się pamiętać, że to ciągle rozwijająca się dziedzina, że trzeba się zatrzymać przed konkurować ... dość o tym, choć; zobaczmy, jakie inne nieprzenośne sekrety leżą u podstaw bajtów całkowitych przechowują ...
Wydaje się, że liczą się bity wartości . W powyższym przykładzie zastosowano plikunsigned
całkowitego, który zazwyczaj zawiera tylko bity wartości, więc łatwo przeoczyć diabła w szczegółach.
Sign bits ... W powyższym przykładzie zacytowałem UINT_MAX
jako górną granicę, unsigned int
ponieważ jest to trywialny przykład wyodrębnienia wartości 16
z komentarza. W przypadku typów ze znakiem, aby rozróżnić wartości dodatnie i ujemne (to jest znak), musimy również dołączyć bit znaku.
INT_MIN -32768 // -(2¹⁵)
INT_MAX +32767 // 2¹⁵ - 1
Wypełnianie bitów ... Chociaż nie jest powszechne napotykanie komputerów, które mają dopełnianie bitów w liczbach całkowitych, standard C pozwala na to; niektóre maszyny (np. ta ) implementują większe typy liczb całkowitych, łącząc ze sobą dwie mniejsze (ze znakiem) wartości całkowite ... a kiedy łączysz liczby całkowite ze znakiem, otrzymujesz zmarnowany bit znaku. Ten zmarnowany bit jest uważany za wypełnienie w C. Inne przykłady bitów wypełnienia mogą obejmować bity parzystości i bity pułapki .
Jak widać, standard wydaje się zachęcać do rozważania zakresów, takich jak INT_MIN
... INT_MAX
i innych wartości minimalnych / maksymalnych ze standardu przy wyborze typów całkowitych, i zniechęca do polegania na rozmiarach, ponieważ istnieją inne subtelne czynniki, które mogą zostać zapomniane, takie jak CHAR_BIT
i wypełnianie bitów, które może wpływać na wartość sizeof (int)
(tj. powszechne nieporozumienia dotyczące dwu- i czterobajtowych liczb całkowitych pomijają te szczegóły).