Frage

Mit scanf, getippt jede Zahl in, würde ich mein Programm gerne auszudrucken zwei Linien: zum Beispiel

byte order: little-endian

> 2
     2 0x00000002
  2.00 0x40000000

> -2
    -2 0xFFFFFFFE
 -2.00 0xC0000000

Ich kann es bekommen die 2 in hex auszudrucken aber ich brauche auch einen Schwimmer und natürlich i kippe scanf als ein wenn ich muss auch Scan als int

Wenn ich als Schwimmer werfen, wenn ich versuche ich eine Null erhalten printf. Wenn ich als Schwimmer einscannen Ich bekomme die richtige Ausgabe. Ich habe versucht, die int a zu konvertieren schwimmen, aber es kommt immer noch aus wie Null.

Hier ist mein Ausgang so weit

Int - float - hex

byte order: little-endian

>2

         2  0x000002
      2.00  00000000

es sieht aus wie ich mit einem Schwimmer fein bin Umwandlung warum wird nicht es als Hex drucken? wenn ich in als Schwimmer scannen erhalte ich die richtige Hex-Darstellung wie das erste Beispiel. dies sollte etwas einfach sein. Ich brauche in als Dezimalzahl scannen merken Sie sich Ich arbeite mit diesem in Cygwin

Hier ist das, was ich habe, so weit ..

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{


int HexNumber;
    float convert;
printf("Int - float - hex\n");



int a = 0x12345678;
unsigned char *c = (unsigned char*)(&a);
if (*c == 0x78)
{
    printf("\nbyte order: little-endian\n");
}
else
{
    printf("\nbyte order: big-endian\n");
}

printf("\n>");
scanf("%d", &HexNumber);
printf("\n%10d  ",HexNumber);
printf("%#08x",HexNumber);





convert =  (float)HexNumber; // converts but prints a zero

printf("\n%10.2f  ", convert); 
printf("%#08x", convert); // prints zeros


return 0;
}
War es hilfreich?

Lösung

versuchen, diese:

int i = 2;
float f = (float)i;
printf("%#08X", *( (int*) &f ));

[EDIT]

@Corey:

Lassen Sie uns analysieren sie von innen nach außen:

&  f = address of f = say address 0x5ca1ab1e
(int*)  &f = interpret the address 0x5ca1ab1e as integer pointer
*  ((int*)&f) = get the integer at address 0x5ca1ab1e

Folgendes ist prägnanter, aber es ist schwer, die Sprache C des Operatorassoziativität und Operator Vorrang (i bevorzugen die zusätzliche Klarheit von einigen zusätzlichen Klammern und Leerzeichen enthält) zu erinnern:

printf("%#08X", *(int*)&f);

Andere Tipps

printf("%#08x", convert); // prints zeros

Diese Zeile wird nicht arbeiten, weil Sie printf sagen, dass Sie in einem int sind vorbei (durch die %x mit), aber infact Sie es in einer float sind vorbei.

Was ist Ihre Absicht, mit dieser Linie? Um zu zeigen, die binäre Darstellung der Fließkommazahl in hex? Wenn ja, möchten Sie vielleicht etwas versuchen:

printf("%lx\n", *(unsigned long *)(&convert));

Was diese Zeile tut wird die Adresse des convert (&convert) unter das ist ein Zeiger auf einen Schwimmer und in einen Zeiger auf ein unsigned long (Anmerkung Gießen: dass der Typ, den Sie in hier werfen verschieden sein können auf die je Größe des Schwimmers und lange auf dem System). Die letzte * wird dereferencing den Zeiger auf ein unsigned long in einen unsigned long, die printf

übergeben wird

int x, zu float Umwandlung, dann die Bytes Druck aus diesem Schwimmer in hex done so etwas wie dies sein könnte:

show_as_float(int x) { 
   float xx = x;

   //Edit: note that this really prints the value as a double.
   printf("%f\t", xx);

   unsigned char *ptr = (unsigned char *)&xx;

   for (i=0; i<sizeof(float); i++)
       printf("%2.2x", ptr[i]);
}

Die Standards (C ++ und C99) geben „Sondergenehmigung“ für unsigned char, so dass es sicher ist, sie zu verwenden, um die Bytes eines beliebigen Objekts anzuzeigen. C89 / 90 hat das nicht garantieren, aber es war einigermaßen tragbar dennoch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top