Problem mit Datentypen



  • Ich habe folgendes Prblem:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    
    int main(void)
    {
        long zahl=0,i=0,a=0,b=0,c=0;
        char string[50];
    
        printf("Zum Beenden 'q' druecken.\n\n");
        printf("%d\n",sizeof(int));//4 Byte=32 Bit
        while(1)
        {
            printf("Bitte geben Sie eine Zahl ein:");
            scanf("%s", string);
            if(strcmp(string,"q")==0)
                break;
            else
                zahl=atoi(string);
            if(zahl>4294967296)//integer constant too large type, dabei ist das 2^32
            {
                printf("Die Zahl ist fuer 16 Bit zu gross\n");
                exit(EXIT_FAILURE);
            }
            printf("\nDie Ausgabe ist:\n");
    
            printf("Input\t Binary\t\t    Hexadecimal\t Decimal\n");
            //printf("%d\t ", zahl);
    
            while (i < 32)
            {
                a = zahl << i;
                b = a & 2147483648;
                c = b >> 32;
                //printf("%d", c);
                i = i+1;
            }
            i=0;
            //printf("\tOx%x", zahl);
            //printf("\t  %d\n\n\n\n", zahl);
        }
        return 0;
    }
    

    warum sagt sizeof mein int wäre 32 Bit lang, und wenn ich was mit der größten 32 Bit Zahl was machen will hab ich einen overflow?



  • 1. Hast du da ein "long" aber das sei dir verziehen, viel schlimmer ist, dass es
    2. signed ist also sein Wertebereich liegt nicht zwischen 0 und 4294967296, sondern zwischen -2147483648 und 2147483647. Zudem ist die Fehlermeldung mit 16Bit falsch, du schreibst doch selber, deine Variable ist 32Bit groß.

    Zudem wird "zahl" niemals > 4294967296 sein. 😃



  • 1. ist long signed und da ist eine Hälfte positiv, die andere negativ.
    Bei 32 Bit geht das von -231 bis 231-1
    2. Und das unsigned long geht von 0 bis 232-1

    Und wenn du wissen willst, wie das auf deinem System aussieht schau in der limits.h nach.



  • Und lies dir mal durch, was atoi() macht, wenn die Zahl im String zu groß/klein ist.



  • ok erstamsl danke,
    aber warum geht dann das hier nicht:

    unsigned long int zahl=0,i=0,a=0,b=0,c=0;
    b = a & 2147483647;//right shift count >=width of type
    

    was heist das?



  • Ich denke das der Fehler "right shift count >=width of type" eher in der Zeile darunter auftritt: c = b >> 32; .
    Du willst eine 32 Bit Zahl um 32 Stellen nach rechts verschieben.
    Überleg mal was da übrig bleibt.

    Laut Babelfish heißt die Fehlermeldung: "Verschiebung nach rechts count >= Breite des Typs"



  • unsigned long long
    

    <- Wurf.



  • Wenn du da jetzt noch weitermachst, solltest du bedenken, dass atoi auch nur int liefert, also signed.
    Für unsigned long gibt es strtoul() .
    Das setzt im Falle eines Überlaufs auch noch die globale Variable errno richtig.


Anmelden zum Antworten