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.
Author: nazia, 2013-12-21

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.

 22
Author: ScarletAmaranth,
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.

 15
Author: Rahul Tripathi,
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)

 3
Author: chux,
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.

 2
Author: gnasher729,
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);
 0
Author: SuperJOE,
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