将int转换为float到hex

时间:2010-01-20 16:36:22

标签: c floating-point integer floating-point-conversion

使用scanf,输入的每个数字,我希望我的程序 打印出两行:例如

byte order: little-endian

> 2
     2 0x00000002
  2.00 0x40000000

> -2
    -2 0xFFFFFFFE
 -2.00 0xC0000000

我可以打印出以十六进制表示的2 但我也需要一个浮动,当然我不能扫描为一个 当我还需要扫描为int

如果我在尝试printf时投射为浮动,我会得到零。如果我以浮动方式扫描 我得到了正确的输出。我试图将int转换为a 漂浮,但它仍然是零。

这是我到目前为止的输出

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

3 个答案:

答案 0 :(得分:8)

试试这个:

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

<强> [编辑]

@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);

答案 1 :(得分:4)

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

这一行不起作用,因为你告诉printf你传递的是int(使用%x),但实际上你是在float传递它1}}。

你对这条线的意图是什么?以十六进制显示浮点数的二进制表示?如果是这样,你可能想尝试这样的事情:

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

这一行正在做的是转换(&convert)的地址,它是指向浮点数的指针,并将其转换为指向unsigned long的指针(注意:你在这里输入的类型可能是根据浮动的大小和系统上的长度不同而不同。最后一个*将指向无符号long的指针解引用为无符号long,并将其传递给printf

答案 2 :(得分:1)

给定一个int x,转换为float,然后以十六进制打印出该float的字节可以这样做:

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并不能保证,但它仍然相当便携。