Wie viele Bytes sind lange ohne Vorzeichen?

81

Wie viele Bytes sind unsigned long long? Ist es das gleiche wie unsigned long long int?

Dushant
quelle
51
Do sizeof (unsigned long long).
Die kommunistische Ente
2
Verwandte, irgendwie. stackoverflow.com/questions/4329777/…
John Dibling
2
Die C- und C ++ - Standards sollten Dinge mit der darin enthaltenen Nummer übernehmen, um die Art und Weise zu überschreiben, wie der Compiler sie automatisch auswählt. So etwas wie float32, float64, int32 usw. bis zu dem von uns benötigten Limit, was ist mit int256 oder float1024? ... dies würde wirklich Schmerzen beseitigen ...
jokoon
2
@gokoon: wie ich in meiner Antwort erklärt, der C - Standard bereits int32_t, uint64_tetc. C ++ wird sie mit dem kommenden Standard erhalten. Sie sind in der Kopfzeile <stdint.h>.
Fred Foo
1
Was ist mit Float und Double?
Jokoon

Antworten:

79

Zusammenfassung: Es ist 64 Bit oder größer.

unsigned long longist das gleiche wie unsigned long long int. Seine Größe ist plattformabhängig, wird jedoch durch den C-Standard (ISO C99) auf mindestens 64 Bit garantiert. Es gab kein long longC89, aber anscheinend unterstützt es sogar MSVC, so dass es ziemlich portabel ist.

Im aktuellen C ++ - Standard (veröffentlicht 2003) gibt es keinen long long, obwohl viele Compiler ihn als Erweiterung unterstützen. Der kommende C ++ 0x-Standard wird dies unterstützen und seine Größe wird dieselbe sein wie in C, also mindestens 64 Bit.

Mit dem Ausdruck können Sie die genaue Größe in Bytes (8 Bit auf typischen Plattformen) ermitteln sizeof(unsigned long long). Wenn Sie genau 64 Bit möchten, verwenden Sie diese Option uint64_t, die im Header <stdint.h>zusammen mit einer Reihe verwandter Typen definiert ist (verfügbar in C99, C ++ 11 und einigen aktuellen C ++ - Compilern).

Fred Foo
quelle
2
@lars: sizeof(char) wird garantiert genau einen zurückgeben . Es gibt zurück, wie groß der Operand in Anzahl von Bytes ist, nicht in der Anzahl von "Zeicheneinheiten". Daher ist es nicht Bytes "auf den meisten Plattformen" seine Bytes auf jeder Plattform.
John Dibling
1
@ John: Das hängt von der Definition des Bytes ab . Wenn Sie gleichsetzen charund Byte, haben Sie Recht. Wenn Sie gleichsetzen charund oktettieren , variiert dies.
Fred Foo
4
@lars: Nein, das tut es nicht. Ein Zeichen ist auf jeder Plattform immer genau ein Byte. Der Standard gibt nicht an, wie viele Bits ein Byte enthält, aber das ist etwas anderes. Eine Implementierung könnte 64-Bit-Bytes verwenden, was sizeof(long long) == 1zu einer Konformität führen würde.
John Dibling
1
@lars: Ich habe dich sowieso schon positiv bewertet, aber hier ist ein Trottel: "Durch den C-Standard (ISO C99) garantiert mindestens 64 Bit == 8 Bytes" Ich kann mir keine nicht eingebettete Welt vorstellen, in der 64 Bit! = 8 Bytes, aber der Standard garantiert dies nicht.
John Dibling
@ John: wieder richtig. Die 64 Bit == 8 Bytes wurden entfernt, da ich mich bereits im Sprachrechtsanwaltsmodus befinde. Und ich habe gehört, dass es tatsächlich eingebettete Plattformen gibt, auf denen ein Byte 16 Bit ist.
Fred Foo
17

Das Schöne an C ++ ist, wie an C, dass die Größe dieser Dinge implementierungsdefiniert ist, sodass es keine richtige Antwort gibt, ohne dass Sie den von Ihnen verwendeten Compiler angeben. Sind diese beiden gleich? Ja. "long long" ist ein Synonym für "long long int" für jeden Compiler, der beide akzeptiert.

Ernest Friedman-Hill
quelle
57
Schönheit oder Fluch?
Michael Burr
2
Während das, was Sie sagen, technisch wahr ist, verlangt der Standard, dass long long mindestens 64 Bit lang ist, und mir ist keine Implementierung bekannt, die eine andere Größe als 64-Bit definiert. Das kann sich ändern, wenn 128-Bit-Compiler herauskommen, aber für aktuelle Compiler ist es kein Problem, 64 Bit anzunehmen.
Boaz Yaniv
2
+1, entgegen der Gegenstimme. Die Antwort hängt von der Bedeutung von 'ist' ab.
Andy Finkenstadt
3
@ Andy: Bill Clinton? Sind Sie das? ;)
John Dibling
4
Dies ist absolut nicht "Die Schönheit von C ++", es ist ein völliger Schmerz: p
asimes
14

Es muss mindestens 64 Bit sein. Ansonsten ist die Implementierung definiert.

Genau genommen unsigned long longist es in C ++ bis zum C ++ 0x-Standard kein Standard. unsigned long longist ein 'Simple-Type-Specifier' für den Typ unsigned long long int(also Synonyme).

Die long longTypengruppe befindet sich ebenfalls in C99 und war bereits vor der Standardisierung eine häufige Erweiterung für C ++ - Compiler.

Michael Burr
quelle
1
"Kürzlich ratifiziert?" Als ich das letzte Mal nachgesehen habe, haben sie überlegt, es auf 2012 zu verschieben.
Fred Foo
1
@ In silico: Ich habe das gelesen. Ich habe auch irgendwo über eine mögliche Verzögerung gelesen, kann mich aber ehrlich gesagt nicht erinnern, wo.
Fred Foo
1
@larsmans: Sofern ich keine offizielle Quelle über die Verzögerung des FDIS sehe (eine Suchmaschinenabfrage nach "C ++ 0x FDIS-Verzögerung" gibt mir keine relevanten Treffer), gehe ich davon aus, dass der Standard 2011 veröffentlicht wird Standard selbst ungeachtet.
In silico
1
@In silico: Ich habe die Referenz auch nicht gefunden, also war es wohl entweder ein Gerücht oder ein Missverständnis meinerseits. Trotzdem denke ich nicht, dass der FDIS-Status der vollständigen Ratifizierung entspricht, oder?
Fred Foo
3

Verwenden Sie den Operator sizeof. Er gibt Ihnen die Größe eines Typs in Byte. Ein Byte besteht aus acht Bits. Siehe folgendes Programm:

#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;
}
Alessandro Jacopson
quelle