2016-03-29 10 views
0

Wenn ich eine Variable als float deklariere und zwei hexadezimale Zahlen subtrahiere, erhalte ich jedes Mal, wenn ich kompiliere und laufe, unterschiedliche Antworten. Wenn ich eine Integer-Variable deklariere, bleibt das Ergebnis immer gleich, wenn ich den Code kompiliere und ausführe. Ich verstehe nicht, warum in float speichern das Ergebnis jedes Mal ändert ich mit der Differenz der beiden gleichen Zahlen (0xFF0000 - 0xFF7FF) kompilierenSubtrahierende Hexadezimalzahlen

int main() 
{ 
    float BlocksLeft = 0xFF0000 - 0xFF7FF; 
    int BLeft = 0xFF0000 - 0xFF7FF; 

    printf("%08x\n", BlocksLeft); 
    printf("%08x\n", BLeft); 
} 
+0

ich diesen Online-Compiler http://www.tutorialspoint.com/compile_c_online.php –

+4

Ein Schwimmer ist nicht eine ganze Zahl ohne Vorzeichen bin mit und '% x' ist ein unzulässiger Formatbezeichner für 'BlocksLeft', der zu UB führt. –

+0

Um ein 'float' zu drucken und seine Bedeutung zu sehen, versuchen Sie' printf ("%. 9e \ n", BlocksLeft); '' 08x' ist für vorzeichenlose Ganzzahlen. – chux

Antwort

4

Die folgende Zeile ist falsch:

printf("%08x\n", BlocksLeft); 

%x Format wird Compiler angeben, das Argument, das Sie geben, ist ein int. Dies führte zu undefiniertem Verhalten. Ich habe versucht, den Code zu kompilieren, und ich bekam:

>gcc -Wall -Wextra -Werror -std=gnu99 -o stackoverflow.exe stackoverflow.c 
stackoverflow.c: In function 'main': 
stackoverflow.c:15:4: error: format '%x' expects argument of type 'unsigned int', but argument 2 has type 'double' [-Werror=format=] 
    printf("%08x\n", BlocksLeft); 
    ^

Bitte, versuchen Sie mit stärkeren Warnstufe zu kompilieren, mindestens -Wall.

Sie können Ihr Programm auf diese Weise, zum Beispiel korrigieren:

#include <stdio.h> 

int main() 
{ 
    float BlocksLeft = 0xFF0000 - 0xFF7FF; 
    int BLeft = 0xFF0000 - 0xFF7FF; 

    printf("%08x\n", (int) BlocksLeft); // Works because BlocksLeft's value is non negative 
    // or 
    printf("%08x\n", (unsigned int) BlocksLeft); 
    // or 
    printf("%.8e\n", BlocksLeft); 

    printf("%08x\n", BLeft); 
} 
+0

Detail: '"% x "' ist für 'unsigned'. '"% x "' funktioniert auch mit nicht-negativem 'int'. – chux

+0

@chux Ich liebe Details! Antwort bearbeitet. – jdarthenay

+0

Weitere Details dann: '"% x "' ist für 'unsigned':" ..., x, X Das Argument 'unsigned int' wird konvertiert ..." C11 §7.21.6.1 8 Die Funktion 'fprintf'. '"% x "' funktioniert auch mit nichtnegativem 'int', weil" ein umgestufter Typ ein vorzeichenbehafteter ganzzahliger Typ ist, der andere umgestufte Typ der entsprechende vorzeichenlose Integertyp ist und der Wert in beiden Typen darstellbar ist; " §6.5.2.2 6 Funktionsaufrufe "..." – chux