• 从数据表字段 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”

  • 相关阅读:
    undefined vs. null
    Callback()
    python基础----元类metaclass
    python基础----__next__和__iter__实现迭代器协议
    python基础----析构函数__del__
    python基础----__slots__方法、__call__方法
    python基础----实现上下文管理协议__enter__和__exit__
    python基础----__setitem__,__getitem,__delitem__
    python基础----isinstance(obj,cls)和issubclass(sub,super)、反射、__setattr__,__delattr__,__getattr__、二次加工标准类型(包装)
    python基础----特性(property)、静态方法(staticmethod)、类方法(classmethod)、__str__的用法
  • 原文地址:https://www.cnblogs.com/tosser/p/11773869.html
Copyright © 2020-2023  润新知