large integer implicitly truncated to unsigned type



  • Hey,

    Es gibt im Internet zwar viele Beiträge zu diesem Thema aber irgendwie hat mir keiner geholfen. Meistens hies es cast es einfach zu unsigned char oder sonst etwas aber irgendwie hilft mir das nichts. Ich programiere ein C programm für einen PowerPC und mein verwendeter compiler ist ein vom powerpc mitgelieferter gcc.

    /* 1 byte */
       #define LZSCHAR   char 
    
      /* this is for IEC-Type sint; 
          define it as "signed char" if your compiler interprets "char" as unsigned */
       #define LZSSHORT char
    
        /* 1 byte */
        #define LZSBYTE unsigned char 
    
        /* 2 byte */
       #define LZSSINT signed short int
        /* 2 byte */ 
       #define LZSINT signed short int
        /* 2 byte */
        #define LZSUINT unsigned short int 
    
       #define LZSWORD unsigned short int
        /* 4 byte */
       #define LZSLONG signed long int
        /* 4 byte */
       #define LZSDWORD unsigned long int
    
    #define XORX(A, S, B, x) MAKELONG(MAKEWORD(x | 0x78, 0x02 | B << 3), MAKEWORD((S << 5) | A, 0x7C | (S >> 3)))
    
    LZSWORD MAKEWORD(LZSBYTE b_high_i, LZSBYTE b_low_i)
    {
    	LZSWORD w_retValue;
    	w_retValue =  (b_high_i << 8) | b_low_i;
    	return w_retValue;
    }
    LZSDWORD MAKELONG(LZSWORD w_high_i, LZSWORD w_low_i)
    {
    	LZSDWORD w_retValue;
    	w_retValue =  (w_high_i << 16) | w_low_i;
    	return w_retValue;
    }
    
    LZSDWORD dwInstruction = 0
    
    dwInstruction = XORX(HR_EXTS_GPR, HR_EXTS_GPR, HR_EXTS_GPR, 0);
    

    Das ist mein Code, eigentlich auf mehrere Dateien verteilt. Ich bekomme jetzt immer den oben genannten Fehler in der Zeile mit dwInstruction = ... . Ich hab schon soo viele casts an so unterschiedlichen stellen probiert aber nichts scheint zu helfen, oder ich versteh es einfach nicht die richtige Stelle für den Cast zu finden. Vielleicht kann mir ja einer von euch weiterhelfen, es ist zwar nur ein warning aber eigentlich würde ich den gerne verschwinden lassen...



  • Mein GNU schluckt den Code ohne warnung.
    Wenn nichts hilft, kann dir nur #pragma weiterhelfen. 😃



  • Ja das wäre schade wenn es da keine andere Möglichkeit gibt 😞

    Hatte übrigens vergessen die ..._GPR sachen sind einfach nur defines für constanten die die Registernummer wiederspiegeln



  • w_retValue =  (w_high_i << 16) | w_low_i;
    

    Würde ich so nicht schreiben.

    w_retValue =  w_high_i;
    w_retValue<<=16;
    wretValue|=w_low_i;
    

    Analog MAKEWORD.
    Alternativ ginge auch ein hässlicher cast, oder, ganz hässlich:

    #define MAKEDWORD(a, b)      ((LONG)(((WORD)(((DWORD)(a)) & 0xffff)) | ((DWORD)((WORD)(((DWORD)(b)) & 0xffff))) << 16))
    

    🙂



  • @Vicious Falcon

    Der erste teil deiner Antwort ist doch nur ne Schönheitskorrektur oder? Das hat mir zumindest wenig bei meinem Problem geholfen. Das mit dem define is wirklich leider nicht schön, hab auch nicht ausprobiert ob mir das überhaupt helfen würde.

    Schade, dass es keine vernünftige Lösung gibt. Danke trotzdem 😃



  • Habe mittlerweile etwas neues rausgefunden und dachte vielleicht könnt ihr damit was anfangen ich hab mal wieder viel ausprobiert aber nix hat gehoflfen. Es geht immer noch um den gleichen code wie oben nur das diesemal die folgenden beiden Anweisungen ausgeführt werden, die erste gibt den Warning die zweite nicht:

    #define BO_CONDITION_TRUE		12
    #define BO_CONDITION_FALSE		 4
    
    dwInstruction = BCX(BO_CONDITION_TRUE, BI_CONDITION_EQ, 67, 0, 0);
    dwInstruction = BCX(BO_CONDITION_FALSE, BI_CONDITION_EQ, 72, 0, 0);
    

    Zusätzlich zu dem obigen code wie gesagt. Ich habe versucht vor die 12 beim define alle möglichen casts zu schreiben nichts hilft. Wenn ich die 12 durch die 4 ersetze kein Problem dann gehen beide Zeilen, ersetze ich das BO_CONDITION_TRUE durch BO_CONDITION_FALSE gehen auch beide. Der Warning kommt also nur bei größeren Zahlenconstanten. Was kann ich denn da noch ausprobieren?



  • Aufgegeben! Ich krieg den Warning nicht weg 😃

    Deswegen wollt ich jetzt nochmal nachfragen, hier hatte vorhin jemand was von #pragma gesagt. Ich hab das jetzt etwas nachgelesen und versucht hin zu bekommen aber ich brauch dafür ja die Nummer des Warnings und ich weiß nicht wirklich wie man das herausfindet da mir eclipse das scheinbar nicht anzeigt.

    Kann mir vielleicht da jemand weiterhelfen? BZW kann man überhaupt den Warning ausschalten oder muss ich dann alle ausschalten weil mir gehts vor allem darum, dass ich keine wichtigen warnings übersehe wegen den 100000 anderen warnings. Wenn alle wegwären hilft mir das genau so wenig 😃


Log in to reply