从数据表字段 float 和 double 说起
今天在公司讨论项目重构的问题时,公司的 dba 针对表中的字段大概介绍了一下 float 和 double 的存储方式。然后,我发现这个问题又回到了浮点数类型在内存中的存储方式,即 ieee 对浮点数存储的标准。
我在之前的内容中写到过,在公司另外一个项目当中,在写一个 tcp 服务器时,对端的设备中发来的数据就存在浮点数,当时 tcp 服务器使用的是 java 的 netty 写的,而对端的设备中的程序是用 c 语言写的,而数据中存在使用 ieee 编码表示的浮点数,所以 java 写的 netty 要对 c 的浮点数进行解析,而不能直接使用。
之前的内容:ieee 二进制浮点数的表示
对于数据在内存中的存储,可能使用 c、c++ 或 asm 等语言开发,会有一个较为清晰的了解和认识,毕竟这些可以很直观的观察内存中数据的存储方式,因为只要想了解数据在内存中的存储方式,可以直接打开调试器去观察内存。
而其他语言可能比较困难,至少我不太清楚 java 的数据在其内存中的存储方式,而 php 的数据存储方式查看起来也不是特别的方便。至少,对于 c、c++ 在 vs ide 的调试环境中,我可以直接查看内存。而 java 的 eclipse、myeclipse 的调试环境中,我并没有注意到有查看变量在内存中存储方式的相关窗口。至于 php 语言,以我短时间阅读 php 底层源码的经验来看,应该存储方式也使用了 ieee 的存储方式相同,因为 php 的这种“变体型类型”无非就是结构体中有数据类型的 type 字段,然后根据不同的 type 在进行存储。
所以,无论是学习哪种语言,我觉得都有必要学习一下 c 语言,c 语言虽然古老,但是它在底层对内存的操作还是值得去学习的,毕竟诞生几十年的 c 语言,依然雄霸语言排行榜的第 2 位。
在道家有一句话叫“1 生 2,2 生 3,3 生万物”。在程序界也有一句话,叫“ 0 1 生汇编, 汇编生 c,c 生万物”。虽然 c 语言不是从汇编语言而来,但是,这句话至少反应了 c 在程序界地位。网上有一张图很好的反应了 c 和其他主流语言的关系,制作很贴切的一张图片,用忍者神龟和它们的老师来表现的。图片的地址:
https://graph.baidu.com/resource/111e0f1732f6c977e382601572363399.jpg
c 已老去,但是有很多的语言中有 c 的影子,c 语言完成了 unix、linux 以及 windows 操作系统,当然包括 mac 系统,包括很多语言其底层也是 c 语言实现的。
如果有兴趣体验一下 ieee 在内存中的存储方式,可以参考如下地址:
http://www.yzmedu.com/learn/2218
我的微信公众号:“码农up2u”