Was passiert, wenn ich in C long int zu int zuweisen?
In einer vergangenen Hausaufgabe ich habe gesagt, verwenden long
variable zum speichern ein Ergebnis, da es eine große Zahl.
Ich beschlossen zu prüfen, wird es wirklich wichtig für mich, auf meinem system (intel core-i5 - /64-bit windows 7/gnu gcc-compiler) und fand heraus, dass der folgende code:
printf("sizeof(char) => %d\n", sizeof(char));
printf("sizeof(short) => %d\n", sizeof(short));
printf("sizeof(short int) => %d\n", sizeof(short int));
printf("sizeof(int) => %d\n", sizeof(int));
printf("sizeof(long) => %d\n", sizeof(long));
printf("sizeof(long int) => %d\n", sizeof(long int));
printf("sizeof(long long) => %d\n", sizeof(long long));
printf("sizeof(long long int) => %d\n", sizeof(long long int));
erzeugt die folgende Ausgabe:
sizeof(char) => 1
sizeof(short) => 2
sizeof(short int) => 2
sizeof(int) => 4
sizeof(long) => 4
sizeof(long int) => 4
sizeof(long long) => 8
sizeof(long long int) => 8
In anderen Worten, auf meinem system int
und long
sind die gleichen, und was zu groß für int
zu halten, wird zu groß für long
halten, wie gut.
Die Hausaufgabe selbst ist nicht das Problem hier. Ich Frage mich, wie auf einem system, wo int < long
sollte ich weisen Sie eine int
zu lange?
Ich bin mir bewusst, der Tatsache, dass dort sind zahlreiche eng Verwandte Fragen zu diesem Thema, aber ich habe das Gefühl, dass die Antworten innerhalb dieser nicht mir das komplette Verständnis von dem, was wird oder kann passieren, in den Prozess.
Grundsätzlich bin ich versucht, herauszufinden, die folgenden:
- Sollte, und ich warf
long
zuint
vor der Zuweisung, oderdalong
ist nicht einen anderen Datentyp, sondern nur ein Modifikator
als unschädliche zu weisen direkt? - Was passiert auf Systemen, auf denen
long > int
? Wird das Resultat sein
nicht definiert (oder unberechenbar) oder es führt dazu, dass die zusätzlichen Teile der
variable weggelassen werden? - Wie funktioniert die Umwandlung von
long
zuint
funktioniert in C? - Wie funktioniert die Zuordnung von
long
zuint
funktioniert in C, wenn ich nicht
verwenden casting?
InformationsquelleAutor der Frage Khaloymes | 2012-11-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Sprache garantiert, dass
int
ist mindestens 16 bit,long
mindestens 32 bits, undlong
darstellen kann mindestens alle Werte, dieint
darstellen kann.Ordnen Sie eine
long
Wert auf eineint
Objekt, es wird implizit konvertiert werden. Es gibt keine Notwendigkeit für eine explizite Umwandlung; es würde nur geben Sie die gleiche Umwandlung, die passieren sowieso.Auf Ihrem system, wo
int
undlong
geschehen, um die gleiche Größe und Reichweite, die Umwandlung ist trivial; es wird einfach kopiert den Wert.Auf einem system, wo
long
breiter alsint
wenn der Wert passt nicht in eineint
dann wird das Ergebnis der Umwandlung wird durch die Implementierung festgelegt. (Und, ab C99, es heben können, eine von der Implementierung definierte signal, aber ich weiß nicht von jedem Compiler, die tatsächlich tun.) Was in der Regel passiert, ist, dass die high-order bits werden verworfen, aber man sollte nicht davon abhängen, dass. (Sind die Regeln anders für unsigned-Typen; das Ergebnis der Umwandlung ein signed oder unsigned-integer zu unsigned-Typ gut definiert ist.)Wenn Sie brauchen, um sicher weisen eine
long
Wert auf eineint
- Objekt können Sie überprüfen, ob es passt, bevor Sie die Aufgabe:Die details "etwas anderes" sind, hängt davon ab, was Sie tun möchten.
Einer Korrektur:
int
undlong
sind immer verschiedene Typen, auch, wenn Sie geschehen, um die gleiche Größe und Darstellung. Arithmetische Typen sind frei konvertierbar, so dass diese oft keinen Unterschied macht, aber zum Beispielint*
undlong*
sind verschiedene und inkompatible Typen, Sie können es nicht zuordnenlong*
zu einemint*
oder Umgekehrt, ohne eine explizite (und potenziell gefährliche) gegossen.Und wenn Sie feststellen, selbst benötigen, um zu konvertieren eine
long
Wertint
das erste, was Sie tun sollten, ist zu überdenken, Ihr code-design. Manchmal werden solche Konvertierungen erforderlich sind, häufiger aber Sie sind ein Zeichen dafür, dass dieint
die Sie zuordnen sollten, wurden definiert als einelong
in den ersten Platz.InformationsquelleAutor der Antwort Keith Thompson
Einen
long
können immer darstellen, alle Werteint
.Wenn der Wert an die hand, die dargestellt werden können durch die Art der variable, die Sie zuweisen, dann wird der Wert beibehalten.
Wenn es können nicht dargestellt werden, dann für die unterschriebenen Ziel-Typ, das Ergebnis ist offiziell nicht angegeben, während für unsigned Typ der destination ist es angegeben wie der ursprüngliche Wert modulo 2nwo n ist die Nummer des bits in dem Wert-Darstellung (die nicht notwendigerweise alle bits in der Ziel -).
In der Praxis auf modernen Maschinen erhalten Sie wickeln auch für signed-Typen.
Das ist, weil die modernen Maschinen verwenden Zweierkomplement bilden zu repräsentieren Ganzzahlen mit Vorzeichen, ohne bits verwendet, um zu Kennzeichnen, "Ungültiger Wert" oder so – d.h., alle bits verwendet, für die wertdarstellung.
Mit n bit-Wert-Darstellung beliebiger integer-Wert ist x wird zugeordnet zu x+K*2n mit der Ganzzahl-Konstante K so gewählt, dass das Ergebnis in den Bereich, wo die Hälfte der möglichen Werte negativ sind.
So, zum Beispiel, mit 32-bit -
int
den Wert -7 vertreten ist als bitpattern Anzahl -7+232 = 232-7, so dass, wenn Sie die Anzeige der Nummer, die bitpattern steht für unsigned integer, erhalten Sie eine ziemlich große Nummer.Dem Grund, dass dies heißt Zweierkomplement ist, weil es Sinn macht für das binäre Zahlensystem, die Basis der zwei-Ziffern-system. Für das binäre Zahlensystem gibt es auch eine solche,' (beachten Sie die Platzierung der Apostroph) ergänzen. Auch für die dezimale numberal system gibt es zehn ergänzen und niners' ergänzen. Mit 4-stelligen zehn ergänzen die Darstellung, die Sie darstellen würde -7 als 10000-7 = 9993. Das ist eigentlich alles.
InformationsquelleAutor der Antwort Cheers and hth. - Alf