大家帮着先一下这段C语言程序,为什么会打印出-0.000000,应该是一个合法的浮点型啊

union
{
unsigned char h[4];
float f;
}T, *s=&T;
s->h[0]=0x40;
s->h[1]=0x84;
s->h[2]=0x82;
s->h[3]=0xA4;

printf("%2f\n",s->f);
return 0;

第1个回答  2011-12-26
你的数在数组中是h[3]=0xA4,h[2]=0x82,h[1]=0x84,h[0]=0x40
在float看来就是:0xA4828440=0b1010 0100 1000 0010 1000 0100 0100 0000
根据float型数据的存储规则,你的数据转换成十进制数就是:
1)计算正负号:首位是“1”,所以是负数;
2)计算偏移量:原二进制数接下来8位是:0b01001001=73,73-127=-54,负号表示存储时小数点被右移了54位
3)计算尾数值:原二进制数剩下的位数是:0b00000101000010001000000=0.0197
所以,float型数据为:0.0197*10^(-54)
所以,printf出来的是0.000000 ……

LZ运行一下:
s->h[0]=0xCC;
s->h[1]=0xCC;
s->h[2]=0xDC;
s->h[3]=0x40;
printf("%2f\n",s->f);
运行结果是:6.900000追问

按IEEE-754标准,换算下来应该是 1.75802002E+1
不知道怎么来的,难道不能用union方式直接转换?

追答

额……表示不是很理解你说的是啥意思……你是说你的代码运行的期望结果应该是 1.75802002E+1、然后现在却是0?

第2个回答  2011-12-26
在union中,一般都是高低位逆序存储的,应该这么写,你再试试看输出是否正确了:

#include <stdio.h>
void main()
{
union
{
unsigned char h[4];
float f;
}T, *s=&T;
s->h[3]=0x40;
s->h[2]=0x84;
s->h[1]=0x82;
s->h[0]=0xA4;

printf("%2f\n",s->f);
}本回答被网友采纳
第3个回答  2011-12-26
f没赋值

大家帮着先一下这段C语言程序,为什么会打印出-0.000000,应该是一...
1)计算正负号:首位是“1”,所以是负数;2)计算偏移量:原二进制数接下来8位是:0b01001001=73,73-127=-54,负号表示存储时小数点被右移了54位 3)计算尾数值:原二进制数剩下的位数是:0b00000101000010001000000=0.0197 所以,float型数据为:0.0197*10^(-54)所以,printf出来的是0.0000...

C语言问题---这个单位换算程序运行,结果是0.000000,用的是float。求解...
1. 您的单位换算程序中,单位换算的顺序可能存在问题。确保在进行任何计算之前,所有的单位都已经转换为同一类型(例如,全部转换为厘米)。2. 在C语言中,使用浮点数进行计算时,需要注意浮点数的表示范围和精度。如果计算结果为0.000000,这可能是因为数值太接近于0,超出了浮点数的表示范围。3. 您提...

c语言基础(初学) 看看这个程序,分析一下,为什么会出现这个结果,谢谢
浮点数由两部分组成:底数部分M+指数部分E: M*2E (M和E都是2进制的 32位二进制是这样划分的:FEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM 其中F是符号位和(和整数一样)E是指数位M是有效数字位(看起来是23位,实际上是24位,并且最高位始终为1)指数部分8位,由于指数可以为负数,所以IEEE754规则规...

C语言编程中,为什么运行结果总是为0.000000
还要注意当方程无根或一个根时,虚根变量会出现浮点数异常,printf便不会将其打印出来

...一下简单的C语言程序时出现了结果为0.000000的错误,不知为何,求...
double请使用%lf float 才用的是%f

为什么c语言里浮点型数据按整型格式输出结果是0??
按照规则编译器是不可能知道你希望第二个参数是浮点数类型,所以也就不可能把int类型的2自动转换成浮点类型的2。另外%f需要的是64位的double,现在你只提供了低32位,高32位只能依赖栈里原有的数据。double类型最高12位小于1003,对应的十进制数就肯定小于0.000001,所以很容易就会输出0 ...

在C语言里,如果定义变量时INT型,但输出是用%f,为什么结果是0.000000
在输出时如果把%后面的字母用错,则输出的结果都是0. 当然如果是double 和float 等则会输出为0.000000 小数点后默认为6位小数

c语言中定义了整型数据但是输出的时候我把它调为浮点型,运行输出了不是...
printf("b=%f,a=%d\\n", (float)b, (int)a); 原因很简单,格式串中的 %f 要求对应的参数必须是浮点型,否则输出就不正确。你已经看到了,输出是 b=0.000000,不正确吧?整型数据调为浮点型必须使用 (float)b,而不是改一下格式串为 %f 就能做到的。

C语言中,下面案例c的值为什么输出的是2.000000?不应该是0吗?
在C语言代码中,变量`c`的值输出为2.000000,而不是预期中的0,原因在于代码中存在语法错误,导致`c`的计算方式并非如提问者所设想的那样。原代码中的错误在于`c=(float)(a+b)2;`这一行。这里的意图可能是将`(a+b)`的结果乘以2后再转换为`float`类型,但由于缺少乘号`*`,编译器实际上将...

c语言的一个小数点问题
因为1和2都是整数,所以1\/2=0;1.0是浮点数,2也被隐式传化成(系统默认双精度)浮点数,所以结果是就是一个浮点数。显然只有1.0\/2才能计算出结果。我这没问题呀,就是6.000000嘛。

相似回答