C-Programmier-Lehrgang 4 – Variablen und Speicher

In dieser Tutorial-Reihe haben wir bisher besprochen, wie man ein einfaches C-Programm erstellt und ausführt, was Präprozessoren sind, sowie die Grundlagen von Variablen. Nun wollen wir ein wenig tiefer in Variablen graben und den Speicheraspekt diskutieren.

Angenommen, Sie sind bereits durch alle unsere bisherigen Tutorials gegangen (oder Sie verfügen über Grundkenntnisse, die zum Verständnis dieses Tutorials erforderlich sind), beginnen wir mit einem einfachen Codebeispiel, das wir in einem unserer früheren Tutorials verwendet haben.

#include <stdio.h>
int main (void)
{
int num = 0, temp=0;
printf("\n Enter a positive integer: ");
scanf("%d", &num);
temp = num;
int result = 1;
while (temp > 0)
{
result = result * temp;
temp = temp -1;
}

printf("\n Factorial of %d is %d\n", num, result);

return 0;
}

Dieses Programm berechnet, wie Sie sehen können, die Fakultät einer vom Benutzer eingegebenen Zahl.

Nun, für kleinere ganze Zahlen wie 5 oder 6 funktioniert dieses Programm gut – es gibt das faktorielle Ergebnis korrekt aus. Aber, sagen wir, Sie probieren es für die Zahl 13 aus. Hier ist das Ergebnis, das Sie erhalten werden:

Factorial of 13 is 1932053504

Aber das ist nicht wahr, da die Fakultät von 13 6227020800 ist. Die Frage ist also natürlich, warum unser Programm eine falsche Antwort gab? Nun, die Antwort liegt in der Menge an Speicher, die eine int Variable im System belegt.

In den meisten heutigen Systemen belegt int 4 Byte (oder 32 Bit) Speicher. Beachten Sie, dass Sie die folgende Zeile in Ihrem Programm verwenden können, um zu wissen, wie viele Bytes int auf Ihrem System belegt.

printf("\n int size in bytes is: %d ", sizeof (int));

Und da eine int Variable auch negative Werte speichern kann, variiert der Wertebereich, den sie speichern kann, von -2.147.483.648 bis 2.147.483.647.

Da nun die Faktorzahl 13 weit größer ist als der maximale Wert, den eine int Variable halten kann, gibt unser Programm eine falsche Ausgabe aus. Die einzige Möglichkeit, das Programm zu korrigieren, besteht darin, einen Variablentyp zu verwenden, der die Kapazität hat, 6227020800 zu halten.

Wenn Sie einen größeren positiven ganzzahligen Wert halten wollen, können Sie ‚unsigned int‘ verwenden, das Werte zwischen 0 und 4.294.967.295 speichern kann (vorausgesetzt, diese Art von Variablen belegt 4 Bytes auf Ihrem System). Aber hier reicht selbst ‚unsigned int‘ nicht aus, da die Fakultät von 13 über ihre maximale Kapazität hinausgeht.

Unser Retter hier wäre also „long long“, der 8 Bytes oder 64 Bit Speicherplatz belegt. Hier ist also das überarbeitete Programm:

#include <stdio.h>
int main (void)
{
long long num = 0; long long temp=0;
printf("\n Enter a positive integer: ");
scanf("%d", &num);
temp = num;
long long result = 1;
while (temp > 0)
{
result = result * temp;
temp = temp -1;
}

printf("\n Factorial of %lld is %lld\n", num, result);

return 0;
}

Die Art und Weise, wie Sie printf oder scanf eine „lange lange“ Variable identifizieren lassen, ist die Verwendung von %lld (oder %I64d in einigen Fällen). Hier ist die Ausgabe, die dieses modifizierte Programm erzeugt:

Factorial of 13 is 6227020800

Das ist korrekt.

Jetzt kennen wir also die Beschränkung von ‚int‘ und wissen, wie ‚unsigned int‘ und ‚long long‘ verwendet werden können, um dies zu überwinden. Denken Sie daran, dass ‚long;‘ ebenfalls ein variabler Typ ist, aber auf den meisten Systemen heutzutage belegen sowohl int als auch long 4 Bytes.

Oh, und ja, während ‚int‘, ‚unsigned int‘ und ‚long long‘ für ganze Zahlen stehen, gibt es ‚float‘ und ‚double‘ für Fließkommazahlen. Float ist 32 Bit und hat 7 Dezimalstellen Genauigkeit, während Double 64 Bit ist und 15 Dezimalstellen Genauigkeit hat.

Die Erwähnung von Fließkommazahlen bringt mich hier zu einem weiteren wichtigen Punkt. Er hängt mit der Division zusammen. Nehmen wir ein einfaches C-Code-Beispiel, um dies zu verstehen.

int main (void)
{
 int a=5, b=10;
printf("\n a/b is %d", a/b);

return 0;
}

Dieses Programm tut also nichts anderes, als a durch b oder 5 durch 10 zu dividieren.

Wenn Sie im wirklichen Leben jemanden nach dem Ergebnis von 5/10 fragen, erhalten Sie in den meisten Fällen 0,5 als Antwort. Aber hier wird die Antwort Null (0) sein. Der Grund dafür ist, dass sowohl „a“ als auch „b“ ganze Zahlen sind, und daher wird das Ergebnis ihrer Division auch als ganze Zahl betrachtet, so dass der gleitende Teil außer Acht gelassen wird.

Um den Gleitkomma-Teil zu erhalten, müssen Sie sicherstellen, dass sowohl ‚a‘ als auch ‚b‘ Gleitkomma-Variablen sind.

#include <stdio.h>
int main (void)
{
float a=5, b=10;

printf("\n a/b is %f", a/b);

return 0;
}

In diesem Fall würde die Ausgabe 0,5 betragen.

Schlussfolgerung

In diesem Tutorial haben wir über die Größe von Variablen und deren Auswirkungen auf die Speicherung von Werten diskutiert. Ich hoffe, Sie hatten eine gute Idee, wie und wann Sie int, unsigned int, long long, float und double verwenden können. Im nächsten Tutorial werden wir sowohl Variablen vom Typ Zeichen als auch Arrays besprechen.

Das könnte dich auch interessieren …