6

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

byte order: little-endian

> 2
     2 0x00000002
  2.00 0x40000000

> -2
    -2 0xFFFFFFFE
 -2.00 0xC0000000

我可以让它打印出十六进制的 2 但我还需要一个浮点数,当然当我需要扫描为 int 时我不能 scanf 作为一个

如果我在尝试 printf 时将其转换为浮点数,我会得到零。如果我作为浮点数扫描,我会得到正确的输出。我试图将 int 转换为浮点数,但它仍然为零。

这是我到目前为止的输出

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

3 回答 3

8

试试这个:

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

[编辑]

@科里:

让我们从内到外解析它:

&  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);
于 2010-01-20T16:52:08.867 回答
4
printf("%#08x", convert); // prints zeros

这条线行不通,因为你告诉printf你正在传递一个int(通过使用%x),但实际上你是在传递它float

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

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

这一行所做的是获取 convert ( &convert) 的地址,它是一个指向浮点数的指针,并将其转换为指向无符号长整数的指针(注意:您在此处转换的类型可能因浮点数的大小而异,并且长期在您的系统上)。最后一个*是将指向 unsigned long 的指针取消引用为 unsigned long 传递给printf

于 2010-01-20T16:48:11.043 回答
1

给定一个 int 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 不能保证这一点,但它仍然是相当便携的。

于 2010-01-20T17:01:42.623 回答