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!


Log in to reply