c语言:float转换为short怎么计算?

2012-04-30 23:28:46 +08:00
 liaofeng
今天翻了翻斯坦福大学的programming paradigms公开课,
lecture 1讲c的数据结构。

其中老师举例:
float f = 7.0;
short s = f;
printf("s=%d\n", s);
结果是:s=7。
假设short占2字节,float占4字节,赋值的时候简单的做了一个截断,所以结果为7(但其实bit pattern还是经过了重新计算)。

然后:
float f = 7.0;
short s = *(short *) &f;
printf("s=%d\n", s);

分析:*(short *) &f 是说赋值的时候将f视为short类型,所以*(short *)&f只能取到f的前两个字节。结果就变成了f前两个字节存储的是什么。
根据float的表现方式:(-1)*2^0 * (1.xxxx)*2^(exp-127)
7.0 = 3.5 * 2 = 1.75 * 2^2
所以exp=129, s=0, 即前9位是0 10000001,结果不可能为0啊

知道怎么回事么?
2399 次点击
所在节点    C
2 条回复
liaofeng
2012-04-30 23:41:29 +08:00
乃们怎么光看不回复啊?
莫非就没有一个尚记得计算机基础知识的老鸟。。。
013231
2012-04-30 23:56:07 +08:00
小端(little-endian)機器中, 數字的低位在低位地址上. float 7在內存中表示位00 00 e0 40,
short s = *(short *) &f;
取其低二位, 故爲0.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/34201

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX