Kleines Problem mit Datentypen



  • Hallo zusammen,
    ich bin noch Anfänger in C und habe folgendes Problem:

    int main(void)
    {
        char zu='\0';
        int i=0xFA;
        zu=i;
        printf("%c\n",zu);//Ausgabe: '.'
        printf("%d\n",zu);//Ausgabe: -6??
        return 0;
    }
    

    Warum ist die Ausgabe -6, wenn dieser Ascii Wert vor der Zeile 5 eh noch 0xFA ist??
    Also

    int main(void)
    {
        int i=0xFA;
        printf("%c\n",i);//i = '.'
        printf("%d\n",i);//i = 250
        return 0;
    }
    

    Ich verstehe nicht ganz warum i im zweiten Code durchaus als Integer geprinted werden kann, und wenn i in einen char zugewiesen ist nicht mehr??
    Mein Aufgabe ist aus einer bmp Datei bestimmte Farbpixel zu redutzieren.

    Ich benutze fscanf() um die einzelnen Zeichen zu extrahieren, hier ein kleines Bsp:
    424D460000000000000036000000280000000200000002000000010018000000000010000000130B0000130B000000000000000000000F00FAFFFFFF0000B9263D00F9060000
    Das ist eine bmp Datei mit 2x2pixel
    mit

    while(!feof(pLoad))
        {
            fscanf(pLoad,"%c",&offsetcharakter);
            printf("Ox%x ",offsetcharakter);
            if(j==offset)
            {
                printf("\n\n");
                while(!feof(pLoad))
                {
                    charakterwandler=offsetcharakter;
                    charakterwandler=charakterwandler%16;
                    printf("Ox%x ",charakterwandler);
                    fscanf(pLoad,"%c",&offsetcharakter);
                }
                printf("\n\n");
                break;
            }
            j++;
        }
    

    suche ich den offset und reduziere die pixel werte,
    mit

    fscanf(pLoad,"%c",&offsetcharakter);
    

    lese ich zeichen ein
    mit

    fscanf(pLoad,"%d",&offsetcharakter);//offsetcharakter it ein int
    

    funktioniert das irgendwie nicht???

    hoffe auf hilfe



  • Warum ist die Ausgabe -6

    Ob char signed oder unsigned ist, ist der Implementierung freigestellt und bei deiner Implementierung ist es offenbar signed. Wenn du explizit unsigned char benutzt, dann sollte das passieren, was du erwartet hast.

    bzw. wenn du eh Binary Daten benutzt, dann nimm gleich uint8_t aus stdint.h

    funktioniert das irgendwie nicht???

    Was heißt "funktioniert nicht"? %d bedeutet int und er liest sizeof(int) byte. (vermutlich 4byte)

    fscanf ist eher für formatierte Eingabe gedacht. Wenn du eh nur byteweise liest, dann nimm lieber man: fgetc oder gleich man: fread.



  • Du willst etwas über Zweierkomplement wissen: http://de.wikipedia.org/wiki/Zweierkomplement

    Tipp: Die Binärdarstellung von 0xFA ist 11111010.



  • Danke an alle für eure hilfe!!


Anmelden zum Antworten