hello,小伙伴们好,我是江湖人送外号[道格牙]的子牙老师。

这篇文章,咱们讨论的问题是数据在计算机中是如何存储的。为什么要讨论这个问题呢?因为在手写JVM的过程中,我们需要实现所有的数据类型,比如说Java中的八种基本类型。那在实现的过程中,Java的八种基本类型在JVM的内存模型中应该如何存储就是我们需要考虑的问题。我们只能通过研究操作系统这块的机制来寻找答案。其实这个知识点也是大家能够真正学明白指针的关键。

本篇文章,你可能会看到很多与你的固有认知不太一样的观点。但是我都会给出证据来证明我的观点:
1、内存不分正负,数据是正是负取决于用的程序
2、正数可以当负数用,负数也可以当正数用
3、原码反码补码的出现,其实是对一个规律的反向推理
4、指针不是指向内存的地址,而是一个个不同大小的容器

正数负数零

如果我们程序中定义了四个这样的变量,它们的值在内存中是如何存储的呢?

先上图,等下解释。这里咱们就不考虑大小端存储问题了。

说明一下,char在C语言中是占一个字节,在Java是占两个字节。我这个图画的是char占一个字节。

这里面最奇怪的是v3,它在内存中是0xFF,跟正数的255是一样的。为什么会这样呢?我先用原码反码补码的知识告诉你答案。等下再告诉你本质。

负数在内存中的存储格式是这样算出的:内存中存储的是负数的反码。反码为补码加一。正数的反码与原码相同。负数的反码为原码的符号位不变,其他位取反。是不是有点晕。

对于原码反码补码,不知道大家学完后什么感觉。我上大学的时候学到这里,觉得好奇葩好复杂。直到随着对计算机底层的认知逐渐深入,了解到它的本质后,豁然开朗,根本就不需要这样去算,一眼就能看出来。下一PA,告诉你本质。

总结来说:从程序角度,有正数、负数、零之分。但是从内存的角度,它是没有这个概念的。内存中存储的数据,这个数据的意义是由程序员来定义的。你希望它是正数,就以正数的方式读取。你希望它是负数,就以负数的方式读取。

揭秘本质

咱们不说浮点型,就说正数。如果内存存储机制由你来设计,需要存储正数负数零,你会如何设计?

经常看我文章的小伙伴可能比较奇怪为什么我总是问:如果是你你会如何设计?因为我希望让大家站在设计者的角度学习思考。从我自身的角度来说,如果我只是站在一个学习者的角度去研究JVM,可能对很多东西的理解就达不到今天这个深度。建议大家学习这个思维,站在设计者的角度,而不是学习者的角度。

上图,进制十六卦图。

大家是否看出规律了:1、正数负数各占一半;2、负数的值根本就不需要算,一眼就能看出来。比如-2,如果是4位是0xE,4位是0xFE,8位就是0xFE…

这就是本质!原码反码补码就是根据这个本质反推出来的。这就是设计者思维!

谈越界

如果你以前对数据越界没有概念。前面讲了那么多,是不是让你对这个词的理解不一样了呢!

拿十进制来说,9+1=10。但是在计算机里面,我们用的数据是有边界的,即数据宽度。比如一个char占一个字节,下面的代码,如果你来设计内存存储,你会怎么做呢

好像很为难是吧。计算机目前的做法很简单粗暴,照样进一,就变成了0x100。但是char只能存放一个字节,那就存0x00。这就是数据越界、数据丢失,程序依然能正常运行。所以定义变量的时候,选择合适的容器很重要。

其实想用Java写出BUG还挺难的,不晓得有些小伙伴是怎么做到面向BUG编程的,成功躲开所有正确选项。Java的数据越界,IDEA会马上提示,但是C++的工具是不会的。这就是底层为什么难学。它是跟计算机的设计思想紧密相连的。

结语

我是子牙老师,喜欢钻研底层,深入研究Windows、Linux内核、JVM。喜欢分享硬核知识,如果你也喜欢研究底层,喜欢硬核知识,关注我:硬核子牙

·

数据在计算机中是如何存储的相关推荐

  1. 【转载】数据在计算机中是如何存储的

    hello,小伙伴们好,我是江湖人送外号[道格牙]的子牙老师. 有几天没更新文章了哈.因为手写JVM小班已经开课了,需要花时间备课,录视频试讲,解答学员问题-比较耗时间.今天就来一篇超实用超硬核的文章 ...

  2. 数据在计算机中存储形式

    数据在计算机中存储形式 考虑到使用二进制等等进行编程,需要了解数据在计算机中的存储形式. 数据在计算机中都是以二进制码存储的. 对于数,是以二进制的补码存储的. 对于有符号的数,其范围是-128~12 ...

  3. 数据在计算机中的存储形式和运算

    一.数据概述 以C语言为例,里面所有的基本数据类型,都是以符合人类世界和自然世界的逻辑而出现的.比如说int,bool,float等等.这些数据类型出现的目的,是更于让人容易理解,可以说,这些数据类型 ...

  4. 在计算机中常用的数据表示方法有哪些,数据在计算机中的表示方法

    1,2020/5/25,数据在计算机中的表示方法,2,2020/5/25,教学目标:了解计算机内部信息用什么进制表示,为什么要采用这种进制:掌握数制之间的转换,了解存储中几个概念及数据的编码重点及难点 ...

  5. 计算机组成原理第二章数据,计算机组成原理第二章数据在计算机中的表示

    计算机组成原理第二章数据在计算机中的表示 (91页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.90 积分 第二章 数据在计算机中的表示 n 概述 ...

  6. 负317是几位数在计算机课中,计算机应用基础数据在计算机中的表示ppt课件

    .,数据在计算机中的表示,[email protected],.,数据在计算机中的表示,进位计数制及相互转换数值.字符和图形图像在计算机中的表示,.,数据单位,计算机中数据的常用单位有位.字节和字.1 ...

  7. 信息在计算机中用几进制表示,2017计算机等级考试知识点:数据在计算机中的表示...

    1.2数据在计算机中的表示 ●计算机所表示和使用的数据可分两大类:数值数据和字符数据[非数值数据],任何形式的数据进入计算机都必须进行二进制编码转换,计算机内部均用二进制数来表示各种信息. ●计算机中 ...

  8. 计算机系统组成及工作原理PPT,第二章 计算机基础知识 2.1 计算机系统的组成与工作原理 2.2 数制转换及运算 2.3 数据在计算机中的表示....

    Presentation on theme: "第二章 计算机基础知识 2.1 计算机系统的组成与工作原理 2.2 数制转换及运算 2.3 数据在计算机中的表示."- Presen ...

  9. 【最全】数据在计算机中的表示及运算

    数据在计算机中的表示及运算 一.计算机的存储单位 1.1 最小单位和基本单位 1.2 常见单位换算 1.3 字节和字长 二.计算机的进制 2.1 常用计数制 2.2 不同数制之间的转换 2.3 二进制 ...

最新文章

  1. 圆角装饰条_天然石材在装饰工程中的收口收边工艺
  2. java什么是局部变量,什么是java的局部变量,成员变量,全局变量?
  3. 窗口分析函数19_Mysql查询窗口函数里第一个 最后一个 第N个元素的值的案例详解(FIRST_VALUE LAST_VALUE NVH_VALUE)
  4. mysql通过binlog日志来恢复数据
  5. 如何利用ide进行跟踪调试_使用调试器进行事后跟踪
  6. Netweaver里某个software component和C4C的版本
  7. fatal error LNK1112: module machine type 'X86' conflicts with target machine type 'x64
  8. Java for LeetCode 036 Valid Sudoku
  9. Mac Android studio: Gradle Build Running 、 run build 运行卡顿 、 加载慢问题问题(亲测可用)
  10. 深入浅出通信原理丨边缘计算阅读周
  11. (强烈推荐)无线网络密码破解方法
  12. 基于软件界面的汽车故障模拟系统
  13. Shiro实现用户自动登录
  14. mysql choose when_mybatis 基础(二) 动态sql 关于where if / where choose when otherwise
  15. matlab英文字母对应数字,MATLAB编程:大写英文字母转换成数值(0-25)两种代码
  16. 【java.lang.ref】当WeakReference的referent重写了finalize方法时会发生什么
  17. [数据可视化] 雷达图(Radar)
  18. Android 桌面图标添加未读消息角标APP角标最佳实践
  19. corelDraw打开文件立即执行宏
  20. mysql concat 性能_MySQL性能优化(一)

热门文章

  1. 免杀Bypass!可过WDF/360/火绒的C#混淆器
  2. 华为平板M3能用鸿蒙吗,三步即完成操作 华为平板 M3就是这么爽
  3. 基于SSM的毕业论文答辩系统
  4. Python编写学籍管理系统
  5. 用php写一个可以抽取随机数的工具一次只抽四个怎么实现?_20多岁,没有本金,该怎么开始理财?...
  6. web网站前端开发时都需要掌握哪些基础语言?
  7. uni-app开发微商素材库
  8. 【nginx原理】企业中使用nginx必须知道的那些事
  9. 《C Primer Plus 》第六版 习题 第六章
  10. 图文 历届奥斯卡影帝 下