2016-01-28 9 views
5

ich persönlich eine Funktion show_bytes wie folgt verwenden:Wie Bytes float zeigen

#include<stdio.h> 
typedef char *byte_pointer; 

void show_bytes (byte_pointer x) 
{ 
     int length = sizeof(float); 
     int i; 
     for(i = 0;i <length;i++) 
     { 
       printf("%2x",*(x+i)); 
       printf("\n"); 
     } 
} 

int main() 
{ 
     float obj; 
     printf("please input the value of obj:"); 
     scanf("%f",&obj); 
     show_bytes((byte_pointer) &obj); 
} 

wenn i Eingang 120,45, die

0x42f0e666 sein sollte
please input the value of obj:120.45 
66 
ffffffe6 
fffffff0 
42 

, warum so viele 'f' vor dem e6 und f0, während ich% .2x verwende.

+3

Es scheint, dass für Ihren Compiler 'char' * signiert * ist. Denken Sie nun darüber nach, wie diese Informationen in einem Fall angewendet werden, in dem Sie * unsignierte * Daten drucken möchten. –

+0

Wenn Sie "Bytes" benötigen (d. H. Nicht "Zeichen"), verwenden Sie nicht "char". Benutze stattdessen 'uint8_t'. – ThiefMaster

+0

Ja, ich ersetze Char mit unsigned char, es stellt sich heraus, dass die Antwort ich will .. Vielen Dank. –

Antwort

6

sollte Ihre Funktion sein:

void show_bytes (byte_pointer x) 
{ 
    int i; 
    for(i = 0; i <sizeof(float); i++) 
    { 
     printf("0x%2X\n", (unsigned int)(*(x++) & 0xFF)); 
    } 
} 

oder

typedef uint8_t *byte_pointer; 

void show_bytes (byte_pointer x) 
{ 
    int i; 
    for(i = 0; i <sizeof(float); i++) 
    { 
     printf("0x%2X\n", *(x++)); 
    } 
} 

In Ihrem Code das Problem ist, dass der Zeiger-Typ ist signed ein zu signed int von printf gefördert wird.

%2X Format begrenzt nicht die Ausgangsziffer, sagt nur printf, dass die Ergebniszeichenfolge mindestens 2 Zeichen lang sein muss.

  • Erste Lösung: Der Wert wird auf signed int gefördert, aber der übergebene Wert wird auf die LSB abgeschnitten.
  • Zweites Beispiel: Wert wird durch den Typ des Zeigers abgeschnitten, der ist unsigned char.

Die Regel lautet:auf Raw-Speicher, immer unsigned-Typen verwenden.

+0

Ich möchte wissen, warum downvoted .. – LPs