union下的float数据类型的输入输出格式 大神进啊!
求大神啊
想用union把float格式的数据 用32bits的格式挨个表示和打印出来
第一位是符号位, 然后8位是exponent 最后23位mantissa是小数位。
红色的部分我看不懂。为什么是
printf("\n mantissa: 0x%-17x", float_32.f_bits.mantissa);
这里的0x%-17x 是什么意思?怎么理解?
代码如下:
#include <stdio.h>
int main(int argc, char * argv[])
{
union float_32{
float floating_value_in_32_bits;
int floating_value_as_int;
struct sign_exp_mantissa{
unsigned mantissa:23;
unsigned exponent:8;
unsigned sign:1;
} f_bits;
struct single_bits{
unsigned b0 :1;
unsigned b1 :1;
unsigned b2 :1;
unsigned b3 :1;
unsigned b4 :1;
unsigned b5 :1;
unsigned b6 :1;
unsigned b7 :1;
unsigned b8 :1;
unsigned b9 :1;
unsigned b10:1;
unsigned b11:1;
unsigned b12:1;
unsigned b13:1;
unsigned b14:1;
unsigned b15:1;
unsigned b16:1;
unsigned b17:1;
unsigned b18:1;
unsigned b19:1;
unsigned b20:1;
unsigned b21:1;
unsigned b22:1;
unsigned b23:1;
unsigned b24:1;
unsigned b25:1;
unsigned b26:1;
unsigned b27:1;
unsigned b28:1;
unsigned b29:1;
unsigned b30:1;
unsigned b31:1;
}bit;
} float_32;
char bit_string[43];
int i;
for(i=0; i<42; i++){
bit_string[i] = ' ';
}
bit_string[42] = '\0';
printf("please enter a floating point number and new-line: ");
scanf("%g", &float_32.floating_value_in_32_bits);
bit_string[0] = float_32.bit.b31?'1':'0';
bit_string[2] = float_32.bit.b30?'1':'0';
bit_string[3] = float_32.bit.b29?'1':'0';
bit_string[4] = float_32.bit.b28?'1':'0';
bit_string[5] = float_32.bit.b27?'1':'0';
bit_string[7] = float_32.bit.b26?'1':'0';
bit_string[8] = float_32.bit.b25?'1':'0';
bit_string[9] = float_32.bit.b24?'1':'0';
bit_string[10] = float_32.bit.b23?'1':'0';
bit_string[12] = float_32.bit.b22?'1':'0';
bit_string[13] = float_32.bit.b21?'1':'0';
bit_string[14] = float_32.bit.b20?'1':'0';
bit_string[16] = float_32.bit.b19?'1':'0';
bit_string[17] = float_32.bit.b18?'1':'0';
bit_string[18] = float_32.bit.b17?'1':'0';
bit_string[19] = float_32.bit.b16?'1':'0';
bit_string[21] = float_32.bit.b15?'1':'0';
bit_string[22] = float_32.bit.b14?'1':'0';
bit_string[23] = float_32.bit.b13?'1':'0';
bit_string[24] = float_32.bit.b12?'1':'0';
bit_string[26] = float_32.bit.b11?'1':'0';
bit_string[27] = float_32.bit.b10?'1':'0';
bit_string[28] = float_32.bit.b9?'1':'0';
bit_string[29] = float_32.bit.b8?'1':'0';
bit_string[31] = float_32.bit.b7?'1':'0';
bit_string[32] = float_32.bit.b6?'1':'0';
bit_string[33] = float_32.bit.b5?'1':'0';
bit_string[34] = float_32.bit.b4?'1':'0';
bit_string[36] = float_32.bit.b3?'1':'0';
bit_string[37] = float_32.bit.b2?'1':'0';
bit_string[38] = float_32.bit.b1?'1':'0';
bit_string[39] = float_32.bit.b0?'1':'0';
printf("\nthe floating value for INPUT_NUMBER is broken out as:");
printf("\n mantissa: 0x%-17x", float_32.f_bits.mantissa);
printf("or: ");
for (i = 12; i< 40; i++)
printf("%c", bit_string[i]);
printf("\n exponent: 0x%-17x", float_32.f_bits.exponent );
printf("or: ");
for (i = 1; i < 11; i++ )
printf("%c", bit_string[i]);
printf("\n sign: %-17d ",float_32.f_bits.sign);
printf(" or: %c", bit_string[0]);
printf("\n in base 10: %-17f", float_32.floating_value_in_32_bits);
printf(" or: %s\n", bit_string);
return 0;
}
printf 数据
[解决办法]
这不关union和float什么事。纯粹的printf格式
0x就是输出0x两个字符
%-17x是左对齐输出17位16进制数。具体自己去搜printf的format specifier。