Przechodzę z Javy do C ++ i mam kilka pytań na temat long
typu danych. W Javie, aby utrzymać liczbę całkowitą większą niż 2 32 , wystarczy napisać long x;
. Jednak w C ++ wydaje się, że long
jest to zarówno typ danych, jak i modyfikator.
Wydaje się, że istnieje kilka sposobów użycia long
:
long x;
long long x;
long int x;
long long int x;
Ponadto wydaje się, że istnieją takie rzeczy jak:
long double x;
i tak dalej.
Jaka jest różnica między tymi wszystkimi różnymi typami danych i czy wszystkie mają ten sam cel?
c++
long-integer
1110101001
źródło
źródło
long long
może być wolniejszy niżlong
, co może być wolniejszy niżint
.Odpowiedzi:
long
ilong int
są identyczne. Podobnie jaklong long
ilong long int
. W obu przypadkachint
opcja jest opcjonalna.Jeśli chodzi o różnicę między tymi dwoma zestawami, standard C ++ nakazuje minimalne zakresy dla każdego, a
long long
to co najmniej tak szeroki jaklong
.Kontrolujące części standardu (C ++ 11, ale to już istnieje od dłuższego czasu) to, na przykład
3.9.1 Fundamental types
, sekcja 2 (późniejsza sekcja podaje podobne reguły dla niepodpisanych typów całek):Jest też tabela 9, w
7.1.6.2 Simple type specifiers
której pokazano „odwzorowania” specyfikatorów na rzeczywiste typy (pokazujące, żeint
opcja jest opcjonalna), której sekcja pokazano poniżej:Zwróć uwagę na różnicę między specyfikatorem a typem. Specyfikator to sposób, w jaki informujesz kompilator, jaki jest typ, ale możesz użyć różnych specyfikatorów, aby uzyskać ten sam typ.
Dlatego sam
long
w sobie nie jest typem ani modyfikatorem, jak stawia twoje pytanie, jest po prostu specyfikatoremlong int
typu. To samo dotyczylong long
bycia specyfikatoremlong long int
typu.Chociaż sam standard C ++ nie określa minimalnych zakresów typów całkowych, cytuje C99
1.2 Normative references
, jak to ma zastosowanie. Dlatego obowiązują minimalne zakresy określone wC99 5.2.4.2.1 Sizes of integer types <limits.h>
.Z punktu widzenia
long double
tego jest to właściwie liczba zmiennoprzecinkowa, a nie liczba całkowita. Podobnie jak w przypadku typów całkowych, wymagana jest co najmniej tyle samo precyzji co a,double
a także zapewnienie zestawu wartości nad tym typem (co najmniej te wartości, niekoniecznie więcej wartości).źródło
unsigned
iunsigned int
long
ma co najmniej 32 bity (2 ^ 31-1 po każdej stronie zera) ilong long
ma co najmniej 64 (2 ^ 63-1 po każdej stronie).long double
ma zagwarantowany przynajmniej zasięgdouble
, ale może być taki sam. To zależy od komputera. Niektóre FPU mają rozszerzoną precyzję; chipy x87 miały 32-bitową pojedynczą precyzję, 64-bitową podwójną precyzję i 80-bitową rozszerzoną precyzję.Długie i długie int mają co najmniej 32 bity.
długie długie i długie długie int mają co najmniej 64 bity. Musisz używać kompilatora c99 lub nowszego.
długie dwójki są trochę dziwne. Sprawdź je na Wikipedii, aby uzyskać szczegółowe informacje.
źródło
long
jest równoważnelong int
, tak jakshort
jest równoważne zshort int
. Along int
jest znakiem typu całkowego, który ma co najmniej 32 bity, podczas gdy along long
lublong long int
jest znakiem typu całkowego, który ma co najmniej 64 bity.To niekoniecznie oznacza, że a
long long
jest szerszy niż along
. Wiele platform / ABI korzysta zLP64
modelu - gdzielong
(i wskaźniki) mają szerokość 64 bitów. Win64 używaLLP64
, gdzielong
wciąż jest 32 bitów, along long
(i wskaźniki) mają szerokość 64 bitów.Jest to podsumowanie dobra 64-bitowych modeli danych tutaj .
long double
nie gwarantuje wiele innych niż będzie co najmniej tak szeroki jakdouble
.źródło
To wydaje się mylące, ponieważ sam bierzesz
long
jako typ danych.long
jest niczym innym, jak tylko skrótem,long int
gdy używasz go sam.long
jest modyfikatorem, możesz go używaćdouble
również jakolong double
.long
==long int
.Oba zajmują 4 bajty.
źródło
Historycznie, we wczesnych czasach C, kiedy procesory miały 8 lub 16 bitów długości słowa,
int
były identyczne z dzisiejszymishort
(16 bitów). W pewnym sensie, int jest bardziej abstrakcyjny typ danych niżchar
,short
,long
lublong long
, jak nie można mieć pewności co do bitwidth.Podczas definiowania
int n;
możesz to przetłumaczyć za pomocą „daj mi najlepszy kompromis w zakresie przepustowości i prędkości na tym komputerze dla n”. Być może w przyszłości powinieneś spodziewać się, że kompilatoryint
będą miały wersję 64-bitową. Więc jeśli chcesz, aby twoja zmienna miała 32 bity i więcej, lepiej użyj jawnegolong
jako typu danych.[Edycja:
#include <stdint.h>
wydaje się być właściwym sposobem na zapewnienie przepływności przy użyciu typów int ## _ t, chociaż nie jest to jeszcze częścią standardu.]źródło
long
gwarantowana jest wartość co najmniej 32 bitów. (Normy mogą ulec zmianie.) Obecny projekt C ++ 14 mówi tylko: @CM „Zwykłe inty mają naturalny rozmiar sugerowany przez architekturę środowiska wykonawczego, inne podpisane typy liczb całkowitych mają na celu zaspokojenie specjalnych potrzeb” (sekcja 3.9.1 ). Nie znalazłem w nim ani słowa o relacjach długości różnych int. __int32 nie jest tak naprawdę częścią standardu, ale od C ++ 11 dostępne są typy typef, takie jak int_fast32_t lub int_least32_t, aby uzyskać dokładnie to, czego chcesz.char
miał prawie jednogłośnie 8 bitów,short
16 ilong
32;int
może mieć 16 lub 32. Uwaga na niektórych platformach (zwłaszcza 68000) zarówno 16-bitowe, jak i 32-bitoweint
były dość powszechne, a niektóre kompilatory miały opcje do obsługi. Kod, który musiał być przenośny, miał więc być używanyshort
lublong
preferowanyint
.Podczas gdy w Javie a
long
ma zawsze 64 bity, w C ++ zależy to od architektury komputera i systemu operacyjnego . Na przykład, along
to 64 bity w systemie Linux i 32 bity w systemie Windows (zostało to zrobione, aby zachować zgodność wsteczną, umożliwiając 32-bitowym programom kompilację w 64-bitowym systemie Windows bez żadnych zmian).Uważany jest za dobry styl C ++, którego należy unikać,
short int long ...
a zamiast tego należy użyć:Te (
int*_t
) można wykorzystać po dołączeniu<cstdint>
nagłówka.size_t
jest w<stdlib.h>
.źródło