• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Czy to prawda, że szerokość typu int zależy od wersji) wersji (w sensie bitowej) systemu?

Ultraszybki serwer VPS NVMe START
0 głosów
67 wizyt
pytanie zadane 4 dni temu w C i C++ przez Werlock Początkujący (290 p.)
Forumowicze, pasjonaci!

Ostatnio przerabiając kilka książek wysunąłem wniosek, że typ int ma max. 32 bity w systemach 32-bitowych i max. 64 bity w systemach 64-bitowych. Chciałbym, żebyście potwierdzili czy mam rację, czy bredzę.

Dodatkowo proszę - wyjaśnijcie od czego w zasadzie zależy szerokość poszczególnych typów w C++. Podobno od kompilatora, komputera i systemu - a dokładniej? Jest jakaś hierarchia typu: kompilator w trakcie kompilacji sprawdza jaki jest system zainstalowany na komputerze i na tej podstawie ustawia sobie poszczególne szerokości poszczególnych typów?

 

Czy jeśli kompilator ustali, że int ma 64 bity, a ja plik wykonywalny uruchomię na 32-bitowym systemie to co? Nie uruchomi się, czy może to komputer w trakcie uruchamiania programu dobiera odpowienie szerokości typów.

 

Bardzo proszę - wyjaśnijcie mi jak to z tym jest, z góry bardzo dziękuję.

P.S. Wiem o typach o precyzyjnie żądanej szerokości w c++11.

1 odpowiedź

+1 głos
odpowiedź 4 dni temu przez the_danger Obywatel (1,060 p.)

Standard gwarantuje, że niezależnie od platformy i implementacji rozmiar inta to zawsze przynajmniej 16 bitów. Jednakże na większości nowoczesnych implementacji i platformach int ma zawsze 32 bity. Istnieje jednak typ size_t którego rozmiar zależy od bitowości systemu a więc od tego w jakim trybie działa procesor. size_t na systemach 32 bitowych ma 32 bity a na 64 bitowych... zgadnij ;)

wyjaśnijcie od czego w zasadzie zależy szerokość poszczególnych typów w C++ 

Standard definiuje minimalne rozmiary podstawowych typów danych i implementacje muszą spełniać te wymogi. 

 

komentarz 4 dni temu przez Werlock Początkujący (290 p.)
Hmmm.. No rzeczywiście wiem, że standard wyznacza minima, nawet je znam (int nie mniejszy niż short, czyli 16 bitów i nie większy niż long itd.)

To pociągnę dalej:

1. Szerokość typu jest ustalana w trakcie kompilacji czy w trakcie uruchamiania pliku wykonywalnego, tj. program X (tworzony na komputerze i z użyciem kompilatora gdzie typ int ma 64 bity) ma w sobie deklarację int-a czy jeśli ten program odpalę na komputerze 32-bitowym, to nie uruchomi się czy może szerokość będzie ustalana dopiero w trakcie uruchamiania exe i komputer 32-bitowy int-y 64-bitowe zamieni w 32-bitowe?

2. Czemu typy int zwykle mają np. 16 i 32 bity a nie np. 24?
komentarz 4 dni temu przez the_danger Obywatel (1,060 p.)
1. C++ jest językiem kompilowanym i wszystko jest ustalane w czasie kompilacji. Problem o którym piszesz zazwyczaj się nie pojawi bo:

a) programy skompilowane na systemach 64 bitowych nie uruchomią się na systemach 32 bitowych

b) jak juz pisałem na 64 bitowych platformach int ma 32 bity

Jeśli jednak chcesz mieć pewność co do rozmiaru typów danych to możesz użyć: http://en.cppreference.com/w/cpp/types/integer

2. Bo procesory lubią jak wszystko jest potęgą dwójki. Dostęp do zmiennych jest wtedy szybszy (czasami na nie których CPU jeśli rozmiary nie są poprawnie wyrównane to program się crashnie).
komentarz 4 dni temu przez Werlock Początkujący (290 p.)
Ok, coraz jaśniej.

To powiedz mi jeszcze co mogę (i czy w ogóle coś mogę) zrobić żeby programy kompilowane na 64-bitowym "sprzęcie" móc uruchamiać na 32-bitowym systemie?

 

No bo jeśli tak jak mówisz program skompilowany na sprzęcie 64-bitowym nie uruchomi się na 32-bitowym to czuję pewien dyskomfort z używania 64-bitowego komputera bo moje programy będą działały tylko na 64-bitowym sprzęcie.
komentarz 4 dni temu przez the_danger Obywatel (1,060 p.)

To powiedz mi jeszcze co mogę (i czy w ogóle coś mogę) zrobić żeby programy kompilowane na 64-bitowym "sprzęcie" móc uruchamiać na 32-bitowym systemie?

Nie. Programy skompilowane na 64 bitowych systemach, działają w long mode to znaczy, że używają 64 bitowych rejestrów, 64 bitowego instruction setu i innych udogodnień, których nie ma w protected mode, czyli w trybie, w którym procesor działa na 32 bitowych systemach.

Ale nie ma się czym przejmować. Popatrz np. na większość nowych gier. Wszystkie są na systemy 64 bitowe systemy. Prawda jest taka, że 32 bity odchodzą w zapomnienie (i dobrze).

komentarz 4 dni temu przez mokrowski Nałogowiec (38,580 p.)

To powiedz mi jeszcze co mogę (i czy w ogóle coś mogę) zrobić żeby programy kompilowane na 64-bitowym "sprzęcie" móc uruchamiać na 32-bitowym systemie?

Oczywiście że możesz. Systemy pracujące w arch. 64-bit, najczęściej dostarczają warstwę kompatybilności do oprogramowania pracującego w 32-bitach. Czyni tak MS Windows jak i GNU/Linux. Kompatybilność ta zapewniana jest przez obecność bibliotek pracujących w trybie 32-bit. Stąd wystarczy że kompilując program, powiadomisz kompilator o tym że kod wynikowy ma być 32/64-bitowy. 

Oczywiście sprawa zawsze rozbija się o szczegóły. Jeśli np. w 64-bitowym GNU/Linux twój 32-bitowy program użyje biblioteki 32-bitowej, to aby działał poprawnie (a wręcz nawet się uruchomił), powinna ona być obecna w tym systemie.

komentarz 4 dni temu przez Werlock Początkujący (290 p.)
To dobra wiadomość, a jak dać cynk Code::Blocksowi, używającemu kompilatora GNU GCC, że ma tworzyć kody  wynikowe 32/64-bitowe?
komentarz 4 dni temu przez mokrowski Nałogowiec (38,580 p.)
-m32 lub -m64

Zgadnij który do czego :-)
komentarz 4 dni temu przez Werlock Początkujący (290 p.)
Ok, to zatrybione. Ostatnia rzecz - gwarantuję, że więcej nie chcę na razie wiedzieć :D

Niech to będzie swoista kropka:

Czy zdanie: "n-bitowość systemu określa górną szerokość typu int, tj. jeśli arch. jest 32-bitowa - nie da rady zastosować 64 bitowego inta" jest prawidłowe?

 

Tym samym wnioskuję, że obecnie int nie może być większy niż 64 - bity, bo nie ma 128-bitowych systemów? (a przynajmniej nie są powszechnie stosowane)?

 

To by było na tyle - obiecuję :D
komentarz 4 dni temu przez mokrowski Nałogowiec (38,580 p.)
Tu masz w przystępnej formie opisane zależności pomiędzy wielkościami typów: http://en.cppreference.com/w/cpp/language/types

A co do standaryzacji, standard dla C i C++ definiuje jedynie minimalne wymagania co do typów (strona 22) : http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

W praktyce producenci kompilatorów wybierają długość int'a "tak aby szybko pracował na danej platformie i spełniał wymagania standardu". Kończy się to tabelą w pierwszym odnośniku. Jest jeszcze nagłówek <cstdint> dla C++ i <stdint.h> dla C. Tam są zdefiniowane typy o stałych szerokościach bitowych. Także typy które maja mieć minimalną ilość bitów ( *least*) i typy najszybsze na danej platformie (*fast*). Podawany wcześniej: http://en.cppreference.com/w/c/types/integer

Co do twojego zdania "n-bitowość systemu określa górną ... ", popatrz w pierwszym odnośniku na definicje modelu danych LP32/LP64 oraz ILP32/ILP64. Każdy z systemów ma jakąś arbitralnie wybraną. Można je testować sprawdzając zdefiniowane makra i symbole kompilatora aby "program dowiedział się z czym ma do czynienia" na etapie kompilacji.

Podobne pytania

+1 głos
7 odpowiedzi 264 wizyt
0 głosów
3 odpowiedzi 186 wizyt

41,283 zapytań

80,223 odpowiedzi

158,703 komentarzy

19,710 pasjonatów

Przeglądających: 256
Pasjonatów: 29 Gości: 227

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...