为什么 float 类型转换为整数的十六进制值与 float 的实际十六进制值不同

问题描述 投票:0回答:1

知道 -12.342(浮点数)和 bi 中存储的值的二进制表示是相同的,为什么程序打印的十六进制值彼此不同?

#include <stdio.h>

int main() {
    float bf = -12.342;
    int bi = *(int*) &bf;
    float rbf = *(float*) &bi;
    printf("%X %p\n",bf, &bf);
    printf("%X %p\n", bi, &bi);
    printf("%X %p\n", rbf, &rbf);
    return 0;
}

了解 C 中的底层转换。

c pointers casting bit ieee-754
1个回答
0
投票
当参数传递给可变参数函数(例如

float

)时,
double
值将提升为
printf
值。因此,您传递的是
double
,但
unsigned int
预计会是
%X
。因此,虽然
int
float
可能具有相同的尺寸,但
int
double
显然并非如此。

修复可产生合理的结果。

#include <stdio.h>

void dump( void *p, size_t n ) {
   char *cp = p;
   while ( n-- )
      printf( "%02hhX", *(cp++) );

   printf( "\n" );
}

int main( void ) {
   printf( "%zu\n", sizeof( float ) );
   printf( "%zu\n", sizeof( int ) );

   float bf  = -12.342;
   int   bi  = *(int*)&bf;
   float rbf = *(float*)&bi;

   dump( &bf,  sizeof( bf  ) );
   dump( &bi,  sizeof( bi  ) );
   dump( &rbf, sizeof( rbf ) );
}
4
4
D57845C1
D57845C1
D57845C1

(请记住,字节在小端机器上是“向后”的。)

int bi = *(int*)&bf;
float rbf = *(float*)&bi;
仍然是各种错误。但我们只是在探索,嗯?

© www.soinside.com 2019 - 2024. All rights reserved.