Größe short, int, long, float, double long, double, char
Ich möchte herausfinden, die (short /int /long /float /double /long double /char) Größe, so schrieb ich diesen code:
printf("short\t\t%d\n", sizeof(short));
printf("int\t\t%d\n", sizeof(int));
printf("long\t\t%d\n", sizeof(long));
printf("float\t\t%d\n", sizeof(float));
printf("double\t\t%d\n", sizeof(double));
printf("long double\t%d\n", sizeof(long double));
printf("char\t\t%d\n", sizeof(char));
ABER
die Ausgabe ist:
type bytes
short 512
int 512
long 1024
float 1024
double 1024
long double 1024
char 256
Warum sind die Anzahl der bytes, die so groß ist?
Sollte es nicht sein 2, 8, ...?
Sie haben Recht, es sollten in der Regel... was ist der Kontext, in dem Sie ausgeführt werden diese? zunächst Sprache (vorausgesetzt, C), compiler, hardware, etc.
Das ist seltsam. Was OS, compiler, etc?
Für was es Wert ist, alles immer Links verschoben um 8 bits...
Mit
Das ist seltsam. Was OS, compiler, etc?
Für was es Wert ist, alles immer Links verschoben um 8 bits...
sizeof
gibt eine size_t
, nicht ein int
. So %d
ist nicht angemessen.Mit
%d
drucken size_t
keine implizite Konvertierung von size_t
zu int
. Am besten, Sie interpretiert die bytes einer size_t
als int
. Im schlimmsten Fall, es bolluxes dem Stapel, weil die Plattform ABI wurde verletzt, was dazu führen kann weitere Fehlverhalten durch ein Programm, einen sofortigen Absturz, oder anderen unerwünschten Effekten.InformationsquelleAutor | 2013-09-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
sizeof
Auswertung einesize_t
, nicht einint
. So%d
ist nicht angemessen; Sie sind Berufung auf ein Undefiniertes Verhalten.Ordnungsgemäß drucken Daten des Typs
size_t
, schlage ich vor, z.B.printf("%zu\n", sizeof(float));
usw.%zu
fürsize_t
. In der Theorie, nicht definiertes Verhalten verursachen könnte, kein problem, aber ich bezweifle, dass das root-problem wie kann ich das problem nicht reproduzieren mit%d
.- What ist der Unterschied zwischen size_t oder int, in C++?.
InformationsquelleAutor Oliver Charlesworth
Verwenden : format specifier long unsigned int. es wird gut funktionieren.
Ex:
printf("sizeof(long double)= %lu\n", sizeof(long double));
Ans:16
%lu
ist eine korrekte Formatbezeichner fürsize_t
.Vielen Dank für Ihr feedback, können Sie korrigieren Sie mich hier ? Ich nehme meine Antwort, sobald Sie mir die Lösung.
size_t
können Sie einen alias für jede unsigned-Typ, der mindestens 16 bit. Das heißt, es kann seinunsigned short
,unsigned int
,unsigned long
oderunsigned long long
. Auf "exotische" - Implementierungen kann es sogar seinunsigned char
! Beim Aufruf einer Funktion ohne Prototyp oder eine Variable Funktion wieprintf
dass nicht der Prototyp dessen Variable Argumente, Sie müssen garantieren, dass die ist Art der Argumentation entspricht dem Typ der Funktion erwartet als argument zu sein;%lu
ist nicht das richtige format specifier, es sei dennsize_t
passiertunsigned long
. In C99 und später%zu
immer funktioniert.> Diese Frage und Ihre Antworten haben mehr Informationen.
InformationsquelleAutor akshaypmurgod