• 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?

VPS Starter Arubacloud
0 głosów
826 wizyt
pytanie zadane 14 listopada 2017 w C i C++ przez Werlock Użytkownik (580 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ź 14 listopada 2017 przez the_danger Gaduła (4,800 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 14 listopada 2017 przez Werlock Użytkownik (580 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 14 listopada 2017 przez the_danger Gaduła (4,800 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 14 listopada 2017 przez Werlock Użytkownik (580 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 14 listopada 2017 przez the_danger Gaduła (4,800 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 14 listopada 2017 przez mokrowski Mędrzec (155,460 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 14 listopada 2017 przez Werlock Użytkownik (580 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 14 listopada 2017 przez mokrowski Mędrzec (155,460 p.)
-m32 lub -m64

Zgadnij który do czego :-)
komentarz 14 listopada 2017 przez Werlock Użytkownik (580 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 14 listopada 2017 przez mokrowski Mędrzec (155,460 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

0 głosów
1 odpowiedź 300 wizyt
pytanie zadane 13 września 2019 w HTML i CSS przez matedoo Nowicjusz (210 p.)
0 głosów
0 odpowiedzi 97 wizyt
0 głosów
7 odpowiedzi 972 wizyt

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...