Ile bajtów jest długich bez znaku?


84

Ile to bajtów unsigned long long? Czy to to samo co unsigned long long int?


52
Do sizeof (unsigned long long).
Kaczka komunistyczna

2
Powiązane, w pewnym sensie. stackoverflow.com/questions/4329777/…
John Dibling

2
Standardy C i C ++ powinny zaadoptować elementy zawierające liczbę, aby nadpisać sposób, w jaki kompilator automatycznie wybiera. Coś w rodzaju float32, float64, int32 itd., Do dowolnego limitu, którego potrzebujemy, a co z int256 lub float1024? ... to naprawdę
usunęłoby

2
@gokoon: jak to wyjaśniłem w mojej odpowiedzi, średnia C ma już int32_t, uint64_titp C ++ otrzyma je z nadchodzącym standardem. Są w nagłówku <stdint.h>.
Fred Foo

1
a co z float i double?
żart

Odpowiedzi:


82

Podsumowanie: ma 64 bity lub więcej.

unsigned long longjest taki sam jak unsigned long long int. Jego rozmiar zależy od platformy, ale standard C (ISO C99) gwarantuje, że ma co najmniej 64 bity. W long longC89 nie było , ale najwyraźniej obsługuje go nawet MSVC, więc jest dość przenośny.

W obecnym standardzie C ++ (wydanym w 2003 r.) Nie ma long long, chociaż wiele kompilatorów obsługuje go jako rozszerzenie. Nadchodzący standard C ++ 0x będzie go obsługiwał, a jego rozmiar będzie taki sam jak w C, więc co najmniej 64 bity.

Możesz uzyskać dokładny rozmiar w bajtach (8 bitów na typowych platformach) za pomocą wyrażenia sizeof(unsigned long long). Jeśli chcesz mieć dokładnie 64 bity, użyj uint64_t, które jest zdefiniowane w nagłówku <stdint.h>wraz z kilkoma pokrewnymi typami (dostępne w C99, C ++ 11 i niektórych obecnych kompilatorach C ++).


2
@lars: sizeof(char) gwarantuje, że zwróci dokładnie jeden . Zwraca, jak duży jest operand w liczbie bajtów, a nie w liczbie „jednostek char”. Dlatego nie ma bajtów „na większości platform” to bajty na każdej platformie.
John Dibling

1
@John: to zależy od definicji bajtu . Jeśli zrównujesz chari bajt, masz rację. Jeśli zrównasz chari oktet , to się zmieni.
Fred Foo

4
@lars: Nie, tak nie jest. Znak to zawsze dokładnie jeden bajt na każdej platformie. Standard nie określa, ile bitów znajduje się w bajcie, ale to inna sprawa. Implementacja mogłaby używać 64-bitowych bajtów, co spowodowałoby sizeof(long long) == 1i byłoby zgodne.
John Dibling,

1
@lars: I tak już na ciebie zagłosowałem, ale oto dzióbek: „gwarantowane przez standard C (ISO C99), aby mieć co najmniej 64 bity == 8 bajtów”. Nie wyobrażam sobie świata bez osadzenia, w którym są 64 bity! = 8 bajtów, ale Standard tego nie gwarantuje.
John Dibling,

@John: znowu w prawo. Usunięto 64 bity == 8 bajtów, ponieważ jestem już w trybie prawnika języka. Słyszałem, że faktycznie istnieją platformy osadzone, w których bajt ma 16 bitów.
Fred Foo,

17

Piękno C ++, podobnie jak C, polega na tym, że rozmiar tych elementów jest określony przez implementację, więc nie ma poprawnej odpowiedzi bez określenia kompilatora, którego używasz. Czy te dwa są takie same? Tak. „long long” jest synonimem „long long int” dla każdego kompilatora, który akceptuje oba.


2
Chociaż to, co mówisz, jest technicznie prawdą, standard wymaga, aby długość ta wynosiła co najmniej 64 bity i nie znam żadnej implementacji, która definiuje dowolny rozmiar inny niż 64-bitowy. Może się to zmienić, gdy pojawią się kompilatory 128-bitowe, ale dla obecnych kompilatorów nie jest rozciągnięciem zakładanie 64-bitowych.
Boaz Yaniv

2
+1, odpierając głos przeciw. Odpowiedź zależy od znaczenia „jest”.
Andy Finkenstadt

3
@Andy: Bill Clinton? Czy to ty? ;)
John Dibling

4
To absolutnie nie jest „Piękno C ++”, to kompletny ból: p
asimes

@MichaelBurr 8 lat później wciąż zastanawiam się, co robię ze swoim życiem, próbując dowiedzieć się, jak zbliżyć się jak najbliżej do tego, co robi Rust z wymuszonymi rozmiarami typów, przynajmniej z perspektywy programisty, który napisał literały w czasie kompilacji. Wciąż nie ma takiego szczęścia. Takie rzeczy to nic innego jak czysta agonia.
Sahsahae

15

Musi mieć co najmniej 64 bity. Poza tym jest zdefiniowana implementacja.

Ściśle mówiąc, unsigned long longnie jest standardem w C ++ aż do standardu C ++ 0x. unsigned long longjest „prostym specyfikatorem typu” dla typu unsigned long long int(więc są to synonimy).

long longZestaw typów jest również w C99 i był częstym rozszerzenie kompilatory C ++ nawet zanim zostaną ujednolicone.


1
"Niedawno ratyfikowany?" Ostatni raz sprawdzałem, czy rozważają przełożenie tego na 2012 rok.
Fred Foo


1
@In silico: Czytałem to. Czytałem też gdzieś o możliwym opóźnieniu, ale szczerze mówiąc nie pamiętam gdzie.
Fred Foo

1
@larsmans: O ile nie widzę oficjalnego źródła o opóźnieniu FDIS (zapytanie w wyszukiwarce „C ++ 0x FDIS delay” nie daje żadnych trafień), w pełni spodziewam się opublikowania standardu w 2011 r., poważne problemy w niezależnie od standardu.
In silico

1
@In silico: Nie znalazłem również odniesienia, więc myślę, że to albo plotka, albo nieporozumienie z mojej strony. Mimo to nie sądzę, aby status FDIS był taki sam jak pełna ratyfikacja, prawda?
Fred Foo

3

Użyj operatora sizeof, poda rozmiar typu wyrażony w bajtach. Jeden bajt to osiem bitów. Zobacz następujący program:

#include <iostream>

int main(int,char**)
{
 std::cout << "unsigned long long " << sizeof(unsigned long long) << "\n";
 std::cout << "unsigned long long int " << sizeof(unsigned long long int) << "\n";
 return 0;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.