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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啊~小 l i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值