我个人使用show_bytes函数,如下所示:

#include<stdio.h>
typedef char *byte_pointer;

void show_bytes (byte_pointer x)
{
        int length = sizeof(float);
        int i;
        for(i = 0;i <length;i++)
        {
                printf("%2x",*(x+i));
                printf("\n");
        }
}

int main()
{
        float obj;
        printf("please input the value of obj:");
        scanf("%f",&obj);
        show_bytes((byte_pointer) &obj);
}

当我输入120.45时,应为0x42f0e666
please input the value of obj:120.45
66
ffffffe6
fffffff0
42

为什么在我使用%.2x时在e6和f0之前有那么多“f”。

最佳答案

您的功能应为:

void show_bytes (byte_pointer x)
{
   int i;
   for(i = 0; i <sizeof(float); i++)
   {
      printf("0x%2X\n", (unsigned int)(*(x++) & 0xFF));
   }
}

或者
typedef uint8_t *byte_pointer;

void show_bytes (byte_pointer x)
{
   int i;
   for(i = 0; i <sizeof(float); i++)
   {
      printf("0x%2X\n", *(x++));
   }
}

在您的代码中,问题在于指针类型为signed,而指针类型由signed int提升为printf
%2X格式不限制输出位数,仅告诉printf结果字符串必须为,至少 2个字符长。
  • 第一种解决方案:将值提升为signed int,但将其传递给
    值被截断到LSB。
  • 第二个示例:值被指针的类型截断,即
    unsigned char

  • 规则是:到原始访问内存,始终使用未签名的类型。

    10-07 21:55