2017-11-06 6 views
-1

Ich versuche nur, die Bits einer ganzen Zahl auszudrucken, und es sieht so aus, als ob der int irgendwie verändert wird, aber es scheint auch dazwischenliegende Aufrufe zu ändern, nicht in der Mitte der Funktion. Meine Funktion ist:Bit-Verschiebung zu Druckbits, die einen Int in C ändern?

void printBits(int bits){ 
    int i = 0; 
    printf("BEFORE: %u\n", bits); 

    while(i < 32){ 
     printf("%d", 1 & (bits >> i)); 
     i++; 
    } 
    printf("\n"); 
    printf("AFTER: %u\n", bits); 
} 

In meinem Haupt, es ist hier aufgerufen und dann das Programm beendet (Primzahlen [0] wird nur die int verwendet wird):

printf("\nBEFORE PRINTBIT: %u\n", primes[0]); 
printBits(primes[0]); 
printBits(primes[0]); 
printf("AFTER PRINTBITS: %u\n", primes[0]); 

und der Ausgang ist:

BEFORE PRINTBITS: 3450182216 
BEFORE: 3450182216 
00010010010110011010010110110011 
AFTER: 3450182216 
BEFORE: 2900726784 
00000000001010011010011100110101 
AFTER: 2900726784 
AFTER PRINTBITS: 2900726784 

Zwischen den Aufrufen von printBits wird nichts aufgerufen, und soweit ich sagen kann, beeinflusst printBits den int nicht. Aber irgendwie verändert es sich. Irgendwelche Ideen, warum das passiert und wie ich es stoppen kann?

+3

Ihre Schleife wird Bit 1 von "Bits" 32 mal drucken. Also verstehe ich nicht einmal, wie du diese Ausgabe bekommen kannst. –

+4

Shifting * signed * Ganzzahlen wird immer sein ... * shifty * (Entschuldigung für das schlechte Wortspiel). Verwenden Sie stattdessen * unsigned * Ganzzahlen. –

+5

Stellen Sie Code zur Verfügung, der das von Ihnen beschriebene Problem reproduziert - a [mcve]. Der Code, den Sie präsentieren, erzeugt weder die von Ihnen ausgegebene Ausgabe, noch weist er das von Ihnen beschriebene Problem auf. Wir schätzen es, wenn Sie es klein halten, aber ein * minimales * Beispiel ist wertlos, es sei denn es ist * vollständig * und * überprüfbar *. –

Antwort

0

Die wahrscheinlichste Erklärung ist, dass primes ein baumelnden Zeiger ist, zeigt in einem Stapelrahmen von einigen zuvor zurück Funktion (zB zurück Sie einen Zeiger auf eine lokale var in einigen früheren Funktion und setzen primes zu diesem Ergebnis). Dies ist ein undefiniertes Verhalten, aber im Allgemeinen wird der Speicher auf dem Stack, der von primes verwendet wird, vom Frame für den ersten Aufruf von printBits wiederverwendet, so dass er von diesem Aufruf geändert wird.