Formel zur Bestimmung der Reichweite von signed und unsigned Datentypen in C++
Ich bin gerade erst in C++ (buchstäblich mein zweiter Tag), und ich wurde zugewiesen, um die Berechnung der Wertebereiche der verschiedenen Datentypen signed und unsigned. Das problem ist, dass meine Schule arbeitet, werde ich nicht auf die Mathematik Teil, wo er lehrt uns die Formel für ein paar Monate. Er sagte, um die Informationen von jemandem, der getan hat, die Mathematik natürlich schon aber alle von Ihnen sagte, dass Sie gehen, um auf diese Arbeit von zu Hause, wo haben Sie Ihre Notizen. So, jetzt bin ich im Dunkeln mit google und deren nicht eindeutig Antworten, so bitte ich Sie, die klugen Leute von stackoverflow.
Was sind die Formeln für das erhalten der Bereich der Daten-Typen? Ich habe eine gefunden für INT, das funktioniert aber nicht für die anderen, die, die er möchte, dass wir uns zu berechnen sind: char, short, long und long long. Er will auch die unsignierten Versionen dieser 4 sowie INT.
Haben wir schon die Größe in bits und bytes, die von jeder dieser Datentypen.
Hier ist, wie ich meine INT-Bereich gelegt:
printf ("\nThe range of int is: %f\n", pow(2, (sizeof(int) * CHAR_BIT) -1));
Du musst angemeldet sein, um einen Kommentar abzugeben.
std::numeric_limits<T>
Können Sie die tatsächlichen Werte für diese Grenzen der Verwendung dieser Funktionen:
T std::numeric_limits<T>::min()
T std::numeric_limits<T>::max()
Ersetzen Sie den entsprechenden Typ an Stelle von
T
wiesigned char
oderunsigned char
.Formeln
Den Formeln für eine signierte Zahl mit N bits (mit Zweierkomplement) sind
Den Formeln für eine vorzeichenlose Zahl mit N bits sind
Beispiel: 8-bit -
char
Den
char
N = 8 bits. Lassen Sie uns überprüfen Sie diese Formeln mitsigned char
undunsigned char
.signed char
unsigned char
^
ist der bitweise xor-operator; C++ hat keine potenzierungsoperator. Aber2**N
kann geschrieben werden als1<<N
.^
im C++ - code für die exponentation. (Sie sollten erwägen, mit 2<sup>n</sup> notation für hoch; es funktioniert in den Antworten, aber nicht in den Kommentaren.)<sup>
.char
hat keine Garantie zu seinsigned
nochunsigned
es sei denn, Sie explizit angeben.In der Wirklichkeit, diese Bereiche finden sich in
<limits>
- siehe Referenz, und insbesondere die Vorlagestd::numeric_limits
- siehe hier. Ich gehe davon aus wenn, Sie wollen wissen, wo diese zahlen herkommen.Was zählt, ist die Anzahl der bits. Wenn Sie
n
bits, dann können Sie express 2n verschiedene Werte mit Ihnen. Nehmen Sie ein old-school 16-bit-Ganzzahl. Mit 16 bits, die Anzahl der möglichen verschiedenen Werte ist 216 = 65536. Wenn Sie einen Wert ohne Vorzeichen, Sie sind nur Ausdruck von nicht-negativen Werten. Also der kleinste Wert, den Sie Ausdrücken, ist 0, die größte ist 2n - 1, also ein 16-bit unsigned integer geht von0
zu65535
.Wenn Sie sind Ausdruck von Ganzzahlen mit Vorzeichen, dann natürlich Sie haben nun die gleiche Anzahl von Werten (65536 im vorherigen Beispiel) zum Ausdruck gebracht, einige positive und negative zahlen. Du hast
0
in der Mitte, und dann teilen Sie die übrigen Werte zwischen den negativen und positiven. So erhalten Sie-32768
auf die low-end-und32767
auf der high end.Für jeden anderen Datentyp, der für eine ganze Zahl, es ist das gleiche Muster, egal ob 32, 64 oder mehr bits.
numeric_limits
kommt aus<limits>
. Die<climits>
bringt in der C-Makros für den gleichen Zweck.