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

byte order: little-endian

> 2
     2 0x00000002
  2.00 0x40000000

> -2
    -2 0xFFFFFFFE
 -2.00 0xC0000000

我可以得到它打印出来的2进制 但我也需要一个浮动,当然我不能scanf函数作为一个 当我需要也扫描作为int

如果我铸造为浮子当我尝试给printf我得到一个零。如果我在扫描为一个float 我得到正确的输出。我曾尝试为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;
}
有帮助吗?

解决方案

尝试这样:

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

其他提示

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

此线是不会工作,因为你告诉printf您在int传递(通过使用%x),但INFACT要传递它在一个float

什么是这一行的意图是什么?为了显示以十六进制的浮点数的二进制表示?如果是这样,你可能想尝试是这样的:

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

什么这行做的是转换(&convert)的地址,这是一个指向float和它浇铸成一个指向一个unsigned long(注:你扔在这里的类型可能会根据不同的浮动的大小和长期系统而定)。最后*被解除引用的指针为无符号长到被传递到printf

的无符号长

鉴于一个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没有保证,但它是合理的便携式不过。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top