NO.19 --- Java 变量的底层原理,二进制,ASCII 码

一、二进制。

  • 1、逢二进一方式。
  • 2、十进制转二进制,除 2 取余法。
  • 3、计算机中存储数据的最小单位。

二、ASCII 编码表。


一、二进制:二进制是计算机的数制,它只有两个数值 0 和 1。对于计算机识别我们输入的文字,它都最终都会转化为二进制,由 0 和 1 组合成对应的数制。二进制采取逢二进一方式的规则来进位。

  • 1.1、二进制表现形式:通过 1 和 0 进行组合。

  • 1.2、0 的二进制是 0。

  • 1.3、1 的二进制是 1。

  • 1.4、2 的二进制不是 2 噢,因为二进制只能识别 0 和 1。所以,大于 1 的数需转换为对应的二进制码计算机才能识别出来。那么,2 的二进制怎么算呢?拿二进制的 1 + 1 ,根据封二进一的规则,1 + 1 不是等于 2 ,而是因为逢二进一应该向前进一位。1 + 1 = 0 并向前进一位,前一位是 1。所以,2 的二进制是 10。

  • 1.5、3 的二进制在 2 的二进制基础上加 1。2 的二进制是 10,10 + 1,个位 0 + 1 = 1,十位的 1 没有数值相加,直接拉下来。所以,3的二进制是 11。
  • 1.6、4 的二进制在 3 的二进制基础上加 1。3 的二进制是 11,个位 1 + 1 = 0 并向十位进一位。十位上的 1 + 进位的 1 = 0 并向百位进一位。百位没有数相加,所以是进位上来的 1。4 的二进制是 100。
  • 1.7、5 的二进制在 4 的二进制基础上加 1。4 的二进制是 100,个位 0 + 1 = 1,十位的 0 和 百位的 1 没有数值相加,直接拉下来。所以,5 的二进制是 101。


  • 1.8、6 的二进制在 5 的二进制基础上加 1。5 的二进制是 101,个位 1 + 1 = 0 并向十位进一位。十位上的 0 + 进位的 1 = 1。百位 1 没有数值相加,直接拉下来。所以,6 的二进制是 110。

  • 1.9、7 的二进制在 6 的二进制基础上加 1。6 的二进制是 110,个位 0 + 1 = 1,十位 和 百位的 1 没有数值相加,直接拉下来。所以,7 的二进制是 111。
  • 1.10、8 的二进制在 7 的二进制基础上加 1。7 的二进制是 111,个位 1 + 1 = 0 并向十位进一位。十位 1 + 进位的 1 = 0 并向百位进一位。百位 1 + 进位的 1 = 0 并向千位进一位。千位没有数相加只显示百位的进位 1 。所以,8 的二进制是 1000。
  • 1.11、9 的二进制在 8 的二进制基础上加 1。8 的二进制是 1000,个位 0 + 1 = 1,十位、百位 和 千位没有数相加,直接拉下来。所以,9 的二进制是 1001。
  • 1.12、10 的二进制在 9 的二进制基础上加 1。9 的二进制是 1001,个位 1 + 1 = 0 并向十位进一位,十位 0 + 1 只显示个位的进位 1。百位 和 千位没有数相加,直接拉下来。所以,10 的二进制是 1010。
  • 1.13、以上通过 1 ~ 10 演示一下转换成二进制逢二进一的过程。这就是二进制,借助它可以把任意数转化成符合计算机要求的 0,1 的二进制形式。

  • 2、十进制转二进制,除 2 取余法:以上是通过 0 和 1 加法计算二进制,这些数都比较小。那么,如果遇到大数难道也通过这样一步一步加起来,再推一个数的二进制出来吗?从时间和精力上显然这个是有难度的。其实,以上只是梳理一下计算机识别的是二进制,二进制的转化概念。对于任意数转化为二进制可以用 除 2 取余法,这个方便很多。

  • 2.1、除 2 取余法顾名思义就是 目标数 / 2 取余数。下面用 除 2 取余法 计算 2 ~ 10 的二级制。

  • 2.2、2 的 二进制用除 2 取余法:2 除以 2 得 1 余 0,1 比 2 小不用除。取 1 和余数 0 由底往上推得出 10。2 的二进制是 10。

  • 2.3、3 的 二进制用除 2 取余法:3 除以 2 得 1 余 1,1 比 2 小不用除。取 1 和余数 1 由底往上推得出 11。3 的二进制是 11。
  • 2.4、4 的 二进制用除 2 取余法:4 除以 2 得 2 余 0,2 除以 2 得 1 余 0,1 比 2 小不用除。取 1 和余数 0,0 ,由底往上推得出 100。4 的二进制是 100。
  • 2.5、5 的 二进制用除 2 取余法:5 除以 2 得 2 余 1,2 除以 2 得 1 余 0,1 比 2 小不用除。取 1 和余数 0,1 ,由底往上推得出 101。5 的二进制是 101。
  • 2.6、6 的 二进制用除 2 取余法:6 除以 2 得 3 余 0,3 除以 2 得 1 余 1,1 比 2 小不用除。取 1 和余数 1,0 ,由底往上推得出 110。6 的二进制是 110。
  • 2.7、7 的 二进制用除 2 取余法:7 除以 2 得 3 余 1,3 除以 2 得 1 余 1,1 比 2 小不用除。取 1 和余数 1,1 ,由底往上推得出 111。7 的二进制是 111。
  • 2.8、8 的 二进制用除 2 取余法:8 除以 2 得 4 余 0,4 除以 2 得 2 余 0,2 除以 2 得 1 余 0,1 比 2 小不用除。取 1 和余数 0,0,0 ,由底往上推得出 1000。8 的二进制是 1000。
  • 2.9、9 的 二进制用除 2 取余法:9 除以 2 得 4 余 1,4 除以 2 得 2 余 0,2 除以 2 得 1 余 0,1 比 2 小不用除。取 1 和余数 0,0,1 ,由底往上推得出 1001。9 的二进制是 1001。
  • 2.10、10 的 二进制用除 2 取余法:10 除以 2 得 5 余 0,5 除以 2 得 2 余 1,2 除以 2 得 1 余 0,1 比 2 小不用除。取 1 和余数 0,1,0 ,由底往上推得出 1010。10 的二进制是 1010。
  • 2.11、138 的二进制用除 2 取余法:138 除以 2 得 69 余 0,69 除以 2 得 34 余 1,34 除以 2 得 17 余 0,17 除以 2 得 8 余 1,8 除以 2 得 4 余 0,4 除以 2 得 2 余 0,2 除以 2 得 1 余 0,1 比 2 小不用除。取 1 和余数 0,0,0,1,0,1,0 ,由底往上推得出 1000 1010。138 的二进制是 1000 1010。
  • 以上是用 除2取余法 转化二进制的流程。

3、计算机中存储数据的最小单位是字节。计算机采用 8 个二进制数为一组来储存数据,称为一个字节(byte 简称 B)。其中,每个二进制为一位(bit 简称 b)。一个字节等于 8 个二进制位,1byte = 8bit,简称 1B=8b。

  • 3.1、比如 2 的二进制是 10,它存到计算机并不是 10 这个形式。而是,0000 0010 这样的形式。4 的二进制是 100,存到计算机是 0000 0100。

  • 3.2、关于计算机最少存储单位是字节也可以在计算机中验证。随便查看一个文件的属性都可以看到它存储单位是字节。

  • 3.2.1、java 文件可以查看到是用字节做单位来存储。

  • 3.2.2、pdf 的文件也可以查看到是用字节做单位来存储。
  • 3.2.3、txt 文件也可以查看到是用字节做单位来存储。
  • 以上介绍了计算机保存数据的最小单位是字节。

二、ASCII 编码表,关于 Text 文本、Image 图片 和 Sound 声音是怎样储存的?实际上最底层还是二进制。

  • 2.1.1、Text 文本:无论是英文字符、数字、符号、中文 或 其他国家文字都会有对应的编码表,这些编码表都有对应的数字编码,这些数字编码都会有对应的二进制形式。提到编码表,就得提最为有名的编码表 --- ASCII 编码表,全称 “ 美国信息交换标准编码 ”,ASCII 定义了常见的英文字符、数字字符 和 西欧字符对应的数字编码。关于 ASCII 表详细的内容信息可到网上搜索,很多相关的资源。
  • 2.1.2、从 ASCII 表中查阅到字符 a 对应的数字是 97。从程序中可以测试一下字符 a 是不是等于 97 ?
package com.elementaryJava.Lesson07Variable;

/**
 * USER:Torres
 * Function:字符对应的 ASCII 码
 */
public class VariableDemo2 {
    public static void main(String[] args) {
        // 声明一个字符变量 c 并赋值为字符 a,char 类型只能保存一个字符
        char c = 'a';
        System.out.println(c + 0);  // 变量 c + 数字0
        System.out.println(c + 1);
    }
}
------------------------------------------------------------------------------
D:\work\java\jdk11\bin\java.exe "-javaagent:D:\work\IntelliJ IDEA 2020.1.3\lib\idea_rt.jar=4107:D:\work\IntelliJ IDEA 2020.1.3\bin" -Dfile.encoding=UTF-8 -classpath D:\work\workspace\learnJava\out\production\learnJava com.elementaryJava.Lesson07Variable.VariableDemo2
97
98

Process finished with exit code 0

  • 从输出中看到,字符 a 赋值到 c 变量。变量 c 和数字 0 相加。得到的结果是 97,变量 c 和数字 1 相加,得到的结果是 98。反推 c 变量里的值 'a' 就是 97 这个数字编码。当然,真正存到计算机的也不是 97,而是 97 对应的二进制形式。根据这个实验可以了解到平常接触的字符其实都会有对应的编码表,这些编码表根据特定的数值 和 底层二进制进行交互。

  • 2.1.3、字符参与运算 和 直接输出字符的表现形式。当声明了字符类型 char 的变量 c 为 'a' 值,输出时变量 c 结果是 a 值。而,用 c 和数字 1 运算时则输出数字 98 。这是因为,直接调用 c 变量进行输出,计算机知道这个变量 c 是 char 字符类型,它会输出 97 对应的值 a。而变量 c 参与运算时,计算机知道这是一个运算,它会用 97 + 1 进行运算,输出运算后的结果。

package com.elementaryJava.Lesson07Variable;


public class VariableDemo2 {
    public static void main(String[] args) {

        char c = 'a';
        System.out.println(c);
        System.out.println(c + 1);
    }
}
------------------------------------------------------------------------------
F:\work\java\jdk11\bin\java.exe "-javaagent:F:\work\IDEA-2020\IntelliJ IDEA 2020.1.3\lib\idea_rt.jar=3343:F:\work\IDEA-2020\IntelliJ IDEA 2020.1.3\bin" -Dfile.encoding=UTF-8 -classpath D:\work\workspace\learnJava\out\production\learnJava com.elementaryJava.Lesson07Variable.VariableDemo2
a
98

Process finished with exit code 0

  • 2.1.4、中文是 unicode 编码,好像 ‘汉’ 的编码是 27721,‘字’的编码是 23383。通过这些唯一的编码值映射到计算机能识别到的二进制形式。
package com.elementaryJava.Lesson07Variable;

/**
 * USER:Torres
 * Function:字符对应的 ASCII 码
 **/
public class VariableDemo2 {
    public static void main(String[] args) {

        char c = '汉';
        char c1 = '字';
        System.out.println(c + 0);
        System.out.println(c1 + 0);
    }
}
------------------------------------------------------------------------------
F:\work\java\jdk11\bin\java.exe "-javaagent:F:\work\IDEA-2020\IntelliJ IDEA 2020.1.3\lib\idea_rt.jar=3989:F:\work\IDEA-2020\IntelliJ IDEA 2020.1.3\bin" -Dfile.encoding=UTF-8 -classpath D:\work\workspace\learnJava\out\production\learnJava com.elementaryJava.Lesson07Variable.VariableDemo2
27721
23383

Process finished with exit code 0


  • 2.2、Image 图片的存储过程。

  • 2.2.1、图片其实是以无数个像素点组成。当把截图放到画图工具,放大都一定程度就会看到图案有些小方块。这些小方块就是像素点。

  • 2.2.2、画图工具上移动鼠标也能看到定位的像素在不停改变。通过这点也可以反映出鼠标定位的点就是当前像素点。
  • 2.2.3、图片中的像素点着色的基础是 RGB 颜色。无数个像素点根据自身不同的颜色组合在一起形成了图片。
  • 2.2.4、计算机对于图片的存储,其实就是对像素点中的 RGB 颜色参数转化成对应的二进制存储。

  • 2.3、Sound 声音的存储过程。

  • 2.3.1、声音的表现形式是声波,将声波的波形转换成一连串的二进制数据来进行储存,当需要播放的时候再把二进制数据转换成声波还原声音。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容