конвертировать int в float в hex - PullRequest
6 голосов
/ 20 января 2010

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

byte order: little-endian

> 2
     2 0x00000002
  2.00 0x40000000

> -2
    -2 0xFFFFFFFE
 -2.00 0xC0000000

Я могу заставить его распечатать 2 в гексе но мне также нужен поплавок и, конечно, я не могу Scanf как один когда мне нужно также сканировать как INT

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

вот мой вывод

Int - float - hex

byte order: little-endian

>2

         2  0x000002
      2.00  00000000

похоже, я конвертирую в штраф почему он не печатает как гекс? если я сканирую как float, я получаю правильное шестнадцатеричное представление, как в первом примере. это должно быть что-то простое. мне нужно сканировать как десятичное иметь ввиду я запускаю это в 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;
}

Ответы [ 3 ]

8 голосов
/ 20 января 2010

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

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

[EDIT]

@ Кори:

давайте разберем это изнутри:

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

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

printf("%#08X", *(int*)&f);
4 голосов
/ 20 января 2010
printf("%#08x", convert); // prints zeros

Эта строка не будет работать, потому что вы сообщаете printf, что вы передаете int (используя %x), но на самом деле вы передаете ее в float.

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

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

То, что делает эта строка, берет адрес convert (&convert), который является указателем на число с плавающей точкой, и преобразует его в указатель на беззнаковый long (примечание: тип, который вы приводите здесь, может отличаться в зависимости по размеру float и long в вашей системе). Последний * разыменовывает указатель на длинную без знака на длинную без знака, которая передается в printf

1 голос
/ 20 января 2010

С учетом целого числа x, преобразованного в число с плавающей точкой, затем распечатать байты этого числа с плавающей точкой в ​​шестнадцатеричном формате можно сделать примерно так:

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 не гарантировал этого, но, тем не менее, он был достаточно портативным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...