Unerklärliche Resultate



  • Ich habe sowohl ein Makro als auch eine Funktion, die mE das selbe tun sollten, aber nicht tun!
    Wenn z.B. zwei Parameter (2,5) übergibt, sollte der Rückgabewert eine Zahl sein, bei der sämtliche Bits vom 2. bis zum 5. gesetzt sind, und alle anderen nicht.
    Merkwürdiger Weise funktioniert das bei der Makro-Version genau so, wie erhofft, aber bei der Funktion, die eigentlich genau dasselbe tun sollte, kommen falsche Rückgabewerte zurück.

    Hier der Test-Quellcode:

    #include <stdio.h>
    
    #define GETBITMASK(x,y) (~0 << (x)) ^ (~0 << (y) + 1)
    
    unsigned getBitMask(unsigned lowBit, unsigned upBit){
    	return (~0L << lowBit) ^ (~0L << (upBit + 1));
    }
    
    /* Testmain */
    int main(){
    	printf("BitMask 2 ... 5 = %u\n", getBitMask(2,5));
    	printf("BitMask 16 ... 31 = %u\n", getBitMask(16,31));
    	printf("BitMask 8 ... 15 = %u\n", getBitMask(8,15));
    	printf("BitMask 0 ... 31 = %u\n", getBitMask(0,31));
    	fgetc(stdin);
    	return 0;
    }
    

    Wenn ich bei den printf() Aufrufen in main() anstatt der Funktion die äquivalente Makro-Version verwende, dann stimmen die Rückgabewerte.
    Ansonsten leider nicht.

    Woran kann das liegen? Wie muss ich die Funktion richtig schreiben, damit sie genauso funktioniert, wie das Makro?



  • test.c:17: warning: left shift count >= width of type
    test.c:19: warning: left shift count >= width of type

    Ich gehe mal davon aus, dass ein Shift von 32 bei 32-Bit-Zahlen in C undefiniert ist. Darum kommen unterschiedliche Ergebnisse raus.

    http://bytes.com/topic/c/answers/526902-left-shift



  • Thx, es hatte tatsächlich damit zu tun, dass man um 32 Stellen nicht schieben darf.


Anmelden zum Antworten