知道 -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 中的底层转换。
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;
仍然是各种错误。但我们只是在探索,嗯?