GNU/Linux >> LINUX-Kenntnisse >  >> Linux

C-Programmier-Tutorial 4 - Variablen und Speicher

In dieser Tutorial-Serie haben wir bisher besprochen, wie man ein einfaches C-Programm erstellt und ausführt, was Präprozessoren sind, sowie die Grundlagen von Variablen. Lassen Sie uns nun etwas tiefer in die Variablen eintauchen und den Speicheraspekt diskutieren.

Angenommen, Sie haben bereits alle unsere Tutorials bis jetzt durchgearbeitet (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 vorherigen 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;
}

Wie Sie sehen können, berechnet dieses Programm die Fakultät einer von einem Benutzer eingegebenen Zahl.

Nun, für kleinere ganze Zahlen wie 5 oder 6 wird dieses Programm gut funktionieren - es wird das Fakultätsergebnis korrekt ausgeben. Aber nehmen wir an, Sie versuchen es mit Nummer 13. Hier ist das Ergebnis, das Sie erhalten:

Factorial of 13 is 1932053504

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

In den meisten heutigen Systemen belegt int 4 Bytes (oder 32 Bits) Speicher. Beachten Sie, dass Sie die folgende Zeile in Ihrem Programm verwenden können, um zu erfahren, 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 die Fakultät von 13 weitaus größer ist als der maximale Wert, den eine int-Variable aufnehmen 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 speichern. 

Wenn Sie einen größeren positiven ganzzahligen Wert speichern möchten, können Sie „unsigned int“ verwenden, das Werte im Bereich von 0 bis 4.294.967.295 speichern kann (vorausgesetzt, diese Art von Variablen belegt 4 Byte auf Ihrem System). Aber hier reicht selbst 'unsigned int' nicht aus, da die Fakultät von 13 ihre maximale Kapazität überschreitet.

Unser Retter hier wäre also „long long“, das 8 Byte oder 64 Bit Speicher belegt. Hier 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;
}

Sie veranlassen printf oder scanf, eine „long long“-Variable zu identifizieren, indem Sie %lld (oder %I64d in einigen Fällen) verwenden. Hier ist die Ausgabe, die dieses modifizierte Programm erzeugt:

Factorial of 13 is 6227020800 

Was richtig ist.

Jetzt kennen wir also die Einschränkung von „int“ und wie „unsigned int“ und „long long“ verwendet werden können, um diese zu überwinden. Denken Sie daran, dass „lang; ' ist ebenfalls ein Variablentyp, aber auf den meisten heutigen Systemen 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 eine Genauigkeit von 7 Dezimalstellen, während Double 64-Bit ist und eine Genauigkeit von 15 Dezimalstellen hat.

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

int main (void)
{
int a=5, b=10;

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

return 0;
}

Dieses Programm macht also nichts, sondern dividiert a durch b oder 5 durch 10.

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, und daher wird der schwebende Teil ignoriert.

Um den fließenden Teil zu erhalten, müssen Sie sicherstellen, dass sowohl 'a' als auch 'b' Fließkommavariablen 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äre die Ausgabe 0,5.

In diesem Tutorial haben wir über die Variablengröße gesprochen und wie sie sich auf die Speicherung von Werten auswirkt. Ich hoffe, Sie haben eine gute Vorstellung davon, wie und wann Sie int, unsigned int, long long, float und double verwenden. Im nächsten Tutorial werden wir sowohl Zeichentypvariablen als auch Arrays besprechen.


Linux
  1. C-Programmier-Tutorial Teil 3 - Grundlagen zu Variablen

  2. Linux C Programming Tutorial Teil 11 - Arithmetische, relationale und logische Operatoren

  3. Linux C Programming Tutorial Part 15 - 2s Komplement und negative Zahlen

  4. Lange Manpages lesen und durchsuchen?

  5. Über Mem und Vmem?

So setzen und listen Sie Umgebungsvariablen in Linux auf

So erhöhen Sie Speicher und CPU auf Vagrant Machine

So setzen und löschen Sie Umgebungsvariablen unter Linux

Gewusst wie:Einführung in die Programmierung – Variablen, Typen und Datenbearbeitung

Bash-Variablen-Tutorial – 6 praktische Bash-Beispiele für globale und lokale Variablen

tmpfs-Nutzung und Größenänderung