JAVA工程师的自我修养——计算机基础

数的表示

一个字节为什么是8位

在计算机中数据用二进制来保存,每一位用0和1表示,一个数据可能由多个0和1组成。在当今世界中,我们通常将8个二进制位称为一个字节。至于为什么,是因为这样的长度能够满足对大多数字符和数字的编码。

ASCII编码系统是美国统一的标准,对美国人来说;所有字符包括单词,标点符号都全部都囊括进了这128(0~127)个字符,美国人用完全就够了。

但是,一个字节可以表示的信息有限,因此一个数据可以由多个字节组成,以便表示更大的编码集,例如中文编码。

最高有效位 与 最低有效位

当一个字节用来表示数字时,像十进制表示数字一样,数位由左往右递减,最左边的是最高位,最右边的是最低位,这就出现了最高有效位与最低有效位的概念:

  • 最高有效位(MSB):一个字节的最左边一位
  • 最低有效位(LSB):一个字节的最右边一位

字节序 与 大端/小端模式

当一个数字由多个字节来表示,那么每个字节的排位就有讲究了,这个顺序叫做字节序

例如Java中,一个整数32位,存放在4个字节中,那么存放高位数字的字节称为高字节,存放低位数字的字节为低字节。在内存中,字节存放的地址由低到高递增。字节序决定了越高的字节存放在越低的地址,还是存放在越高的地址。

大端模式高字节序
(符合日常的从左往右阅读的习惯,网络传输采用的字节序)
高字节存放在低地址,低字节存放在高地址

小端模式低字节序
(x86架构处理器采用的字节序)
低字节存放在低地址,高字节存放在高地址

例如:整数127,十六进制表示为0x0000007F

低地址 ---> 高地址

大端 00 00 00 7F

小端 7F 00 00 00

从程序去理解:

#int转byte数组(低字节序)
public static byte[] toLittleEndian(int n){
    byte[] b = new byte[4];
    b[0] = (byte) (n & 0xff);
    b[1] = (byte) (n >>8 & 0xff);
    b[2] = (byte) (n >>16 & 0xff);
    b[3] = (byte) (n >>32 & 0xff);
}

#byte数组转int(高字节序)
public static int toInt(byte[] bigEndian){
    int n = 0;
    for(int i=0;i<bigEndian.length;i++){
        n += bigEndian[i] << ((3-i)*8); 
    }
}

==对字节序的思考==

只有当一个数据由多个字节组成时,才会有字节顺序的问题。字节序-百度百科

一个数据可以

  1. 编译后保存在二进制可执行文件中,运行时读取
  2. 运行时,通过运算产生,存储在内存中
  3. 从字节流IO中读取,组装成CPU识别的数据
  4. 向字节流IO中写入,传输到外部(网络或磁盘)

对于第一种,产生一个代码跨平台的问题,同一份代码,经过同样的编译后,在不同平台上(主机字节序不同),运行的结果可能不一样。因为同一组字节,按不同字节序的解析可能得到不同的数据。因此,同一份代码需要根据不同的平台,进行有针对性的编译。参考使用Intel编译器解决字节序问题

对于第二种,数据始终保留在本机内存中,没有字节顺序不同的问题

对于第三种,无论是读文本文件、二进制文件,还是网络流量,一个数据首先是需要经过IO字节流,然后读入内存,然后根据约定的格式,读取若干个字节,解析并转化为数据。因此这个约定的格式非常重要,格式中一个重要的点就是字节序(其次还有结束标志等)。

对于网络传输格式的约定:

网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian(大端)排序方式。

对于文本文件:
例如,UTF-16编码方式是两个字节,那么就存在字节顺序的问题,因此UTF-16会分Big-Endian和Little-Endian两种格式的编码,根据文件最前面的BOM——Byte Order Mark(字节序标记)进行区分(参考UTF的字节序和BOM ),FE、FF是编码中不存在的两个字节,因此可以用FEFF来表示大端顺序,FFFE表示小端顺序。UTF-8编码不存在这样的问题,因为它天然地可确定字节顺序的,参考UTF-8编码规则

对于二进制文件:
需要约定文件格式中的字节序,例如字节码Class文件的字节序就规定是大端的。在读取任何文件时,确定其格式(其中包括字节序),才能正确地解释。

对于第四种,与第三种是互逆的过程,写字节流时,需要确定输出内容的格式,才能正确地输出结果。

平台的差异确实会导致许多意料不到的结果,并且需要程序去根据实际情况去处理,因此一次编译,到处运行的Java,就彰显了强大的生命力,它屏蔽了底层硬件的差异,JVM采用统一的大端字节序。


位运算符的语义

0 1 1 0
1 1 0 0
———
0 1 0 0 & 掩码,被1保留,被0抹掉
1 1 1 0 | 结合,一人有大家有,否则大家都为0


Java中不同进制数字的表示方法

十进制:直接写 123
十六进制:0x前缀 0x7f
八进制:0前缀 012
二进制:0b前缀 0b1


浮点数的精度问题

IEEE浮点数标准
V=(-1)^S * M * 2^e

  • 符号(sign):S 浮点数的正负
  • 阶码(exponent):E
    float: e=E−127
    double:e=E−1023
    浮点数的阶值,表示小数点右移多少位
  • 尾数(significand):M 浮点数的数值,是一个二进制小数,且整数部分固定为1,M只存储小数部分,因此可以理解为小数点在M的最前面,这样可以节省存储空间
    浮点数格式
    image

Java中浮点数类型有float和double:
float 32位浮点数:需要加f后缀 1.2f
double 64位浮点数:直接写或加d后缀 1.2 或 1.2d

例如:单精度浮点数 1.2f

十六进制表示为 0x3f99999a

二进制表示为 0011 1111 1001 1001 1001 1001 1001 1010

S=0

E=01111111 即127, e=E-127=0

M=1.00110011001100110011010

换算为十进制即1.2000000476837158(与原来的值不一样了!!)

由于1.2转换为二进制后小数部分是无限循环小数,尾数部分只能做截断并四舍五入处理,导致了精度丢失的问题

当十进制数转换为二进制是出现无限循环小数,或者因小数部分无法全部装入尾数部分而被截断,都会出现精度丢失的问题。

double比float的精度更高,但两者都会出现精度丢失。若不能容忍精度丢失,应使用BigDecimal进行数字运算,并在构造函数时使用字符串来传入数字。

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