C语言结构体指针用法异常问题
Posted 啊~小 l i
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言结构体指针用法异常问题相关的知识,希望对你有一定的参考价值。
#include<stdio.h>
typedef struct student
int sno;
float score;
stu;
int main()
float a = 0.3;
stu li = 1,98.2 ;
stu* p = &li;
float* q = &a;
printf("%d\\n", p->sno);
printf("%f\\n", p->score);
printf("%f\\n", li.score);
printf("%f\\n", a);
printf("%f", *q);
return 0;
为什么会有这种结果?
改为Double就没有问题了!
原因:float编码格式问题
例如:
以float为例,说明编码、解码过程。double相对于float,尾数位变多可以增加其精度。指数位变多可以可以增加其编码数值的大小范围。
编码:
1:符号位S,最好理解,正数符号为0, 负数符号为1。
2:去掉符号位后,剩余的数值,转换成二进制。
3:移动小数点E1位(左移动为正,右移动为负),使得移动后的二进制,形如 1.xxxx。
4:尾数M,就是第3步移动后,小数点后面的值,不足23位的,用0补齐。
5: 指数E = 127+E1。
6: 最终形成 S+E+M+补齐的0, 其二进制值,就是内存中存储的,该浮点数的数值。
解码:
解码
解码过程逆着编码过程即可。
例如,数值 0xbdbd7f93, 其二进制: 1_01111011_ 01111010111111110010011
那么, S = 1,表示负数。指数E = 123,那么E1 = -4,表示小数点经过4位右移,欲还原,需要左移4位
那么,原始二进制数值便是 0.0001 01111010111111110010011,这个值是 0.09252848476171494,加上符号,最终值为-0.09252848476171494
以上是关于C语言结构体指针用法异常问题的主要内容,如果未能解决你的问题,请参考以下文章