今天在公司讨论项目重构的问题时,公司的 DBA 针对表中的字段大概介绍了一下 float 和 double 的存储方式。然后,我发现这个问题又回到了浮点数类型在内存中的存储方式,即 IEEE 对浮点数存储的标准。

 

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

        我在之前的内容中写到过,在公司另外一个项目当中,在写一个 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”

 从数据表字段 float 和 double 说起 Mysql

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄