震惊!为何打印一个浮点数组却输出了“Hello world”?

(自以为标题好有趣哈哈哈哈(* ̄︶ ̄))  

现有如下代码 

#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)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值