C Datentypen

In der Sprache C beziehen sich Datentypen auf ein umfassendes System, das verwendet wird, um Variablen oder Funktionen unterschiedlicher Typen zu deklarieren. Der Typ einer Variablen bestimmt den Speicherplatz, den sie belegt, und wie das gespeicherte Bitmuster interpretiert wird.

Typen in C können in die folgenden Kategorien unterteilt werden:

Laufende NummerTypen und Beschreibungen
1Grundlegende Datentypen
Sie sind arithmetische Typen, einschließlich Ganzzahl (int), Zeichen (char), Gleitkommazahl (float) und Gleitkommazahl mit doppelter Genauigkeit (double).
2Aufzählungstypen:
Sie sind ebenfalls arithmetische Typen und werden verwendet, um Variablen zu definieren, denen in einem Programm nur bestimmte diskrete Ganzzahlwerte zugewiesen werden können.
3void-Typ:
TypspezifizierervoidEin Datentyp, der keinen Wert repräsentiert und üblicherweise für Rückgabewerte von Funktionen verwendet wird.
4Abgeleitete Typen:
Einschließlich Array-Typen, Zeigertypen und Strukturtypen.

Array-Typen und Struktur-Typen werden gemeinsam als Aggregattypen bezeichnet. Der Typ einer Funktion bezieht sich auf den Typ des Rückgabewerts der Funktion. Im folgenden Teil dieses Kapitels führen wir grundlegende Typen ein; die anderen Typen werden in späteren Kapiteln erläutert.

Ganzzahltypen

Die folgende Tabelle listet Details zu den Speichergrößen und Wertebereichen der Standard-Ganzzahltypen auf:

TypeSpeichergrößeWertebereich
char1 Byte-128 bis 127 oder 0 bis 255
unsigned char1 Byte0 bis 255
signed char1 Byte-128 bis 127
int2 oder 4 Bytes-32,768 bis 32,767 oder -2,147,483,648 bis 2,147,483,647
unsigned int2 oder 4 Bytes0 bis 65,535 oder 0 bis 4,294,967,295
short2 Byte-32,768 bis 32,767
unsigned short2 Byte0 bis 65,535
long4 Byte-2,147,483,648 bis 2,147,483,647
unsigned long4 Byte0 bis 4,294,967,295

Beachten Sie, dass die Speichergröße jedes Typs von der Bitanzahl des Systems abhängt, aber derzeit sind 64-Bit-Systeme der Standard.

Im Folgenden sind die Unterschiede in den Speichergrößen zwischen 32-Bit-Systemen und 64-Bit-Systemen aufgeführt (unter Windows identisch):

Um die genaue Größe eines Typs oder einer Variablen auf einer bestimmten Plattform zu ermitteln, können Sie densizeof-Operator verwenden. Der Ausdrucksizeof(type)liefert die Speichergröße in Bytes eines Objekts oder Typs. Das folgende Beispiel zeigt, wie man die Größe des Typs int ermittelt:

Beispiel

#include <stdio.h> #include <limits.h> int main() { printf("Speichergröße von int: %lu\n", sizeof(int)); return 0; }

%luist eine 32-Bit-Ganzzahl ohne Vorzeichen, siehe Details unterC-Bibliotheksfunktion - printf()。

Wenn Sie das obige Programm unter Linux kompilieren und ausführen, erzeugt es die folgenden Ergebnisse:

int 存储大小 : 4 

Gleitkommatypen

Die folgende Tabelle listet Details zu den Speichergrößen, Wertebereichen und der Genauigkeit von Standard-Gleitkommatypen auf:

TypeSpeichergrößeWertebereichPrecision
float4 Byte1.2E-38 bis 3.4E+386 signifikante Stellen
double8 Bytes2.3E-308 bis 1.7E+30815 signifikante Stellen
long double16 Bytes3.4E-4932 bis 1.1E+493219 signifikante Stellen

Die Header-Datei float.h definiert Makros, mit denen Sie diese Werte und weitere Details zur binären Darstellung reeller Zahlen in Ihrem Programm verwenden können. Das folgende Beispiel gibt den Speicherplatz aus, den Gleitkommatypen belegen, sowie ihre Wertebereiche:

Beispiel

#include <stdio.h> #include <float.h> int main() { printf("Maximale Speicherbytes für float: %lu\n", sizeof(float)); printf("Minimalwert für float: %E\n", FLT_MIN ); printf("Maximalwert für float: %E\n", FLT_MAX ); printf("Präzisionswert: %d\n", FLT_DIG ); return 0; }

%Egibt reelle Zahlen mit einfacher und doppelter Genauigkeit in Exponentialform aus, siehe Details unterC-Bibliotheksfunktion - printf()。

Wenn Sie das obige Programm unter Linux kompilieren und ausführen, erzeugt es die folgenden Ergebnisse:

float 存储最大字节数 : 4 
float 最小值: 1.175494E-38
float 最大值: 3.402823E+38
精度值: 6

void-Typ

Der void-Typ gibt an, dass kein Wert verfügbar ist. Er wird üblicherweise in den folgenden drei Situationen verwendet:

Laufende NummerTypen und Beschreibungen
1Funktion gibt nichts zurück
In C geben verschiedene Funktionen keinen Wert zurück, oder man kann sagen, sie geben nichts zurück. Der Rückgabetyp einer Funktion, die keinen Wert zurückgibt, ist void. Zum Beispiel:void exit (int status);
2Funktionsparameter sind leer
In C akzeptieren verschiedene Funktionen keine Parameter. Eine Funktion ohne Parameter kann ein void akzeptieren. Zum Beispiel:int rand(void);
3Zeiger zeigt auf void
Ein Zeiger vom Typ void * repräsentiert die Adresse eines Objekts und nicht einen Typ. Zum Beispiel gibt die Speicherzuweisungsfunktionvoid *malloc( size_t size );einen Zeiger auf void zurück, der in jeden Datentyp umgewandelt werden kann.

Wenn Sie den void-Typ jetzt noch nicht vollständig verstehen, machen Sie sich keine allzu großen Sorgen; wir werden diese Konzepte in späteren Kapiteln ausführlich erklären.


Typumwandlung

Typumwandlung ist das Konvertieren eines Werts eines Datentyps in einen Wert eines anderen Datentyps.

In C gibt es zwei Arten der Typkonvertierung:

  • Implizite Typkonvertierung:Implizite Typkonvertierung erfolgt automatisch in Ausdrücken ohne explizite Anweisung oder Funktionsaufruf. Normalerweise wird automatisch ein kleinerer Typ in einen größeren Typ umgewandelt, z. B. int in long oder float in double. Implizite Typkonvertierung kann auch zu Verlust der Datenpräzision oder Datenabschneidung führen.

  • Explizite Typkonvertierung:Explizite Typkonvertierung erfordert die Verwendung des Typumwandlungsoperators, mit dem ein Wert eines Datentyps in einen Wert eines anderen Datentyps umgewandelt werden kann. Erzwungene Typumwandlung ermöglicht es Programmierern, Datentypen bei Bedarf präziser zu steuern, kann aber auch zu Datenverlust oder Datenabschneidung führen.

Beispiel für implizite Typkonvertierung:

Beispiel

int i = 10;
float f = 3.14;
double d = i + f; // int-Typ implizit in double-Typ konvertieren

Beispiel für explizite Typkonvertierung:

Beispiel

double d = 3.14159;
int i = (int)d; // double-Typ explizit in int-Typ konvertieren
Weitere Erweiterungen