преобразуйте интервал для плавания для преобразовывания в шестнадцатеричную систему

Используя scanf, каждое число ввело, я хотел бы, чтобы моя программа распечатала две строки: например,

byte order: little-endian

> 2
     2 0x00000002
  2.00 0x40000000

> -2
    -2 0xFFFFFFFE
 -2.00 0xC0000000

Я могу заставить это распечатывать 2 в шестнадцатеричном числе, но мне также нужно плавание, и конечно я не могу scanf как тот, когда я должен также просканировать как интервал

Если я снял в качестве плавания, когда я пробую к printf, я получаю нуль. Если я сканирую в как плавание, я получаю корректный вывод. Я попытался преобразовать интервал в плавание, но он все еще выходит как нуль.

вот мой вывод до сих пор

Int - float - hex

byte order: little-endian

>2

         2  0x000002
      2.00  00000000

похоже, что я преобразовываю в штраф плавающий, почему привычка это печатает как шестнадцатеричное число? если я сканирую в как плавание, я получаю корректное шестнадцатеричное представление как первый пример. это должно быть чем-то простым. я действительно должен просканировать в том, поскольку десятичное число имеет в виду, что я выполняю это в cygwin

вот то, что я имею до сих пор..

#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;
}
6
задан Lorenzo Donati supports Monica 22 September 2013 в 20:04
поделиться

3 ответа

Попробуйте это:

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

[REDUCT]

@COREY:

Давайте разбираем его изнутри:

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

Следующее более лаконично, но трудно запомнить ассоциативность оператора языка C и оператор (я предпочитаю Дополнительная ясность некоторых добавленных скобок и пробела обеспечивает):

printf("%#08X", *(int*)&f);
8
ответ дан 8 December 2019 в 18:36
поделиться
printf("%#08x", convert); // prints zeros

Эта линия не собирается работать, потому что вы говорите Printf , что вы проходите в INT (с помощью % X Но инако вы передаваете его в поплавок .

Каково ваше намерение с этой линией? Чтобы показать бинарное представление номера плавающей запятой в Hex? Если это так, вы можете попробовать что-то вроде этого:

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

то, что делает эта строка, это принимает адрес преобразования ( и преобразование ), который является указателем на поплавок и литья его в указатель на Недостаточно длинная (Примечание: что тип, который вы бросаете здесь, могут отличаться в зависимости от размера поплавка и длинного в вашей системе). Последний * разыгрывает указатель в долгосрочную подпись в длину без знака, который передается в PrintF

4
ответ дан 8 December 2019 в 18:36
поделиться

Учитывая INT X, преобразование к Float, затем распечатывая байты, которые поплавок в Hex могут быть сделаны что-то подобное:

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]);
}

Стандарты (C ++ и C99) дают «специальное распределение «Для unsigned Char , поэтому безопасно использовать их для просмотра байтов любого объекта. C89 / 90 не гарантируют это, но это было достаточно портативно.

1
ответ дан 8 December 2019 в 18:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: