Wielkość wskaźnika int i wielkość wskaźnika int na maszynie 64-bitowej
Zastanawiałem się, skąd mogę wiedzieć, czy mój laptop jest maszyną 64 czy 32 bitową. (jest to 64).
Więc pomyślałem o wydrukowaniu:
int main()
{
printf("%d",sizeof(int));
}
W rezultacie otrzymaliśmy 4, co wydawało się dziwne (ponieważ jest to maszyna 64-bitowa)
Ale kiedy wydrukowałem to:
int main()
{
printf("%d",sizeof(int*));
}
Wynik był 8, co miało więcej sensu.
Pytanie brzmi:
Ponieważ używam 64-bitowej maszyny, nie powinien prymitywny Typ, taki jak int powinien używać 8 bajtów
(64 bit) i przez ten Rozmiar int powinien wynosić 8? Dlaczego tak nie jest?
I dlaczego int * ma rozmiar 8?
Trochę zdezorientowany tutaj,
Z góry dzięki.5 answers
Nie, sizeof(int)
jest zdefiniowana jako implementacja i wynosi zwykle 4 bajty.
Z drugiej strony, aby adresować więcej niż 4 GB pamięci (co mogą zrobić systemy 32-bitowe), musisz mieć 8 bajtów szerokości. int*
po prostu przechowuje adres "gdzieś w pamięci", a nie można adresować więcej niż 4 GB pamięci z zaledwie 32 bitami.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-21 16:54:46
Rozmiar wskaźnika powinien wynosić 8 bajtów na dowolnym 64-bitowym kompilatorze C/C++, ale to samo nie jest prawdą dla rozmiaru int.
Wiki ma dobre wyjaśnienie na ten temat:
W wielu środowiskach programistycznych dla języków C i C-pochodnych na Maszyn 64-bitowych, zmienne "int" są nadal 32-bitowe, ale długie liczby całkowite i wskaźniki mają szerokość 64 bitów. Są one opisane jako mające model danych LP64. Inną alternatywą jest model danych ILP64 w które wszystkie trzy dane typy mają szerokość 64 bitów, a nawet SILP64 gdzie "krótkie" liczby całkowite mają również szerokość 64 bitów.[potrzebny przypis] jednak w w większości przypadków wymagane modyfikacje są stosunkowo niewielkie i proste, a wiele dobrze napisanych programów może być po prostu rekompilowane dla nowego środowiska bez zmian. Inny alternatywą jest model LLP64, który zachowuje kompatybilność z 32-bitowy kod, pozostawiając zarówno int, jak i long jako 32-bit. "LL" odnosi się do Typ "long long integer", czyli co najmniej 64 bity na wszystkich platformach, w tym środowiska 32-bitowe.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-21 17:01:54
The sizeof(int)
, sizeof(int*)
, A "rozmiar maszyny", choć często ze sobą skorelowany, może być niezależnie mniejszy, taki sam lub większy od pozostałych. O jedynym wymogiem C jest to, aby były co najmniej 16 bitów ( lub tak) - poza tym kompilator jest zależny od sizeof(int)
, sizeof(int*)
.
(chociaż może wskaźnik musi mieć co najmniej wielkość int. Hmmm)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-21 17:50:58
Programiści lubią mieć typy liczb całkowitych 1, 2, 4 i 8 bajtów lub 8, 16, 32 i 64 bitów. Istnieją tylko dwa typy liczb całkowitych, które mogą być mniejsze niż int: char i short. JeĹ "li int byĹ' 64 bity, to nie mogĹ ' eĹ " mieÄ ‡ wszystkich trzech rozmiarĂłw 8, 16 i 32 bităłw. Dlatego Kompilatory mają tendencję do tworzenia int = 32 bitów, więc można mieć char = 8 bit, short = 16 bit, int = 32 bit, long long = 64 bit i long = 32 bit lub 64 bit.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-29 00:42:07
Ze względu na size_t został zdefiniowany jako
typedef unsigned int size_t;
Powinieneś go wyświetlać za pomocą %zu, % u lub % lu zamiast % d.
printf("%zu\n", sizet);
printf("%u\n", sizet);
printf("%lu\n", sizet);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-08 07:39:49