Max int berechnen
-
Hallo,
ich möchte gerne max int selber berechnen.
Ich bin so vorgegangen:#include <stdio.h> int main() { int size = sizeof(int); long max_int = 1; int i; for (i = 1; i <= size; i++) { max_int *= 256; } --max_int; /* max unsigned int */ max_int = (max_int / 2) - 1; /* max int. Die 0 muss außerdem abgezogen werden */ printf("Max int: %ld\n", max_int); return 0; }
Komischerweise bekomme ich 2147483646 und nicht 2147483647 raus.
Wenn ich das mit dem Taschenrechner rechne, komme ich auf 2147483647.Wo ist der Fehler?
-
Du teilst eine ungerade Zahl durch 2. Dein Programm schneidet einfach die Nachkommastelle ab. Dein Taschenrechner wird wohl bei ,5 aufrunden.
-
Wie groß ist denn bei dir
sizeof(int)
und wie großsizeof(long)
?
-
sizeof(int) = 4
sizeof(long) = 8@Tobiking2: Komischerweise hat mein Taschenrechner bei der großen Zahl versagt. Er hat mir eine gerade Zahl ausgegeben! Oo
Ist meine Berechnung eigentlich falsch?
-
Wenn man das mit einbezieht:
--max_int; /* max unsigned int */
Ist deine Rechnung (232 - 1) / 2 - 1. Das ist auch ohne Integerdivision nicht korrekt.
Übrigens ist auf vielen Maschinen sizeof(int) == sizeof(long), du kannst dich also nicht darauf verlassen, dass UINT_MAX in einen long passt. Eine einfache Methode wäre
int max_int = (int)((unsigned) -1 / 2);
Da (unsigned) -1 == UINT_MAX (vorzeichenlose Typen rechnen modulo ihrer Breite) und die Integerdivision den Rest ignoriert.
Warum benutzt du eigentlich nicht die Konstanten aus <limits.h>?
-
seldon schrieb:
int max_int = (int)((unsigned) -1 / 2);
Da (unsigned) -1 == UINT_MAX (vorzeichenlose Typen rechnen modulo ihrer Breite) und die Integerdivision den Rest ignoriert.
Das ist natürlich auch eine geniale Lösung!
Warum benutzt du eigentlich nicht die Konstanten aus <limits.h>?
Ich gehe gerade alte C-Klausuren durch und da war eben die Berechnung gefragt.
THX!