(自以为标题好有趣哈哈哈哈(* ̄︶ ̄))
现有如下代码
#include <stdio.h>
int main()
{
float a[3]={1143139122437582505939828736.0,76482007234779498639230238720.0,9.222452464e-39};
printf("%d\n", sizeof(float));
printf("%s\n",a);
return 0;
}
请在 GCC 中运行以上代码,你看到了什么运行结果?请演示并解析,为什么打印一个浮点数组,却会输出一段字符?
运行结果:
!!!∑(゚Д゚ノ)ノ咦,怎么输出的是Hello world 呢???
细心的朋友们可能发现了,输出的方式是"%s",而不是"%f",没错,这就是问题所在啦~
float当前环境下占4个字节,char占1个字节。
根据IEEE754标准将上述浮点型数据转化为在内存中的表示,转换方式可参考浮点数与字节数据转换详解,采用以下网站可快速实现转换:https://www.h-schmidt.net/FloatConverter/IEEE754de.html
转换后如图:
可是这连起来不应该是“lleHow o”吗?,但很像Hello World了!!别急,这个还与编程环境的大小端模式有关。
大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。
小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。
所以。。没错!这里测试环境是小端模式。如何判断是大端还是小端可参考->(C语言)如何判断所处环境使用的是大端还是小端
将lleH倒过来->Hell
将ow o倒过来->o wo
将dlr倒过来->rld
最后连起来->Hello world
所以这个浮点数数组很神奇地被打印成了Hello World了!
大概意思是这么回事吧(感觉有坑),等以后学的更深入的时候再来填坑吧。(2019-3-5)