数据类型
数据类型 | 占用内存(字节) | 取值范围 |
---|---|---|
byte | 1 | -2^7 ~ 2^7-1 |
short | 2 | -2^15 ~ 2^15-1 |
int | 4 | -2^31 ~ 2^31-1 |
long | 8 | -2^63 ~ 2^63-1 |
float | 4 | 1.4E-45 - 3.4028235E38 |
double | 8 | 1.7976931348623157E308 ~ 4.9E-324 |
char | 2 | 65536 (看字符编码) |
boolean | 1 | true | false |
浮点数
-
表示
Java 浮点数是采用了 IEEE 754 (IEEE二进制浮点数算术标准),任意一个二进制浮点数V可以为
V = ( − 1 ) s × M × 2 E V = (-1)^s × M × 2 ^E V=(−1)s×M×2E-
(-1)^s 表示符号位,当s=0,V为正数;当 s=1,V为负数.
符号位:只有两个取值 0 或者 1,0代表正数,1代表负数。
-
M表示有效数字,大于等于1,小于2,但整数部分的1可以省略,也叫尾数(Mantissa)
M 可以写成1.xx的形式,其中xxx表示小数部分.IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以 被舍去,只保存后面的xx部分。比如保存1.0101的时候,只保存0101,等到读取的时候,再把第一位的1加上去。这样做的 目的是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第一位舍去以后,等于可以保存24位有效数字
-
2^E表示指数位(Exponent)
E为一个无符号整数 (unsigned int)这意味着,如果E为8位,它的取值范围为0-255;如果E为11位,它的取值范围为 0-2047.然而科学计数法中的E是可以出现负数的,所以 IEEE 754 规定,E的真实值必须再减去一个中间数,对于8位的E, 这个中间数是127;对于11的E,这个中间数是1023。比如2^2的E是2,所以保存成 float 32位浮点数时,必须保存成 2+ 127 = 129,即 10000001
-
小例子:-58.2 在内存是怎么表示的
Integer.toBinaryString(Float.floatToIntBits(-58.2F)); // 可以使用 Java 11 jshell 进行输出该数 // $1 ==> "11000010011010001100110011001101" /* 1 10000100 11010001100110011001101 拆解 第一位表示符号 1 表示为负数 第二位 到 第8位 10000100 表示指数位 真实值为 - 0111 1111 为 0101 第十位 到 第32位 11010001100110011001101 表示尾数小数部分 */
-
E 还需要考虑下面2种情况:.
-
E全为0,这时,浮点数的指数E等于 1-127 (或 1-1023),有效数字M不再加上第一位的1,而是还原0.xxx 的小数,这样做是为了表示 ±0,以及接近于0的很小的数字
jshell> Integer.toBinaryString(Float.floatToIntBits(-0F)); // "1 00000000 00000000000000000000000 jshell> Integer.toBinaryString(Float.floatToIntBits(0F)); // "0 00000000 00000000000000000000000 一般直接输出 0
-
E全为1。这时,如果有效数字M全为0,表示 ± 无穷大(取决于符号位 s );如果有效数字M不全为 0,表示这个数不是一个数(NaN)
Integer.toBinaryString(Float.floatToIntBits(Float.POSITIVE_INFINITY))); // 11111111 00000000000000000000000 // 开头0会被省略 Integer.toBinaryString(Float.floatToIntBits(Float.NEGATIVE_INFINITY))); // 1 11111111 00000000000000000000000 Float.POSITIVE_INFINITY // Infinity Float.NEGATIVE_INFINITY // -Infinity
-
-
-
取值范围
jshell> Integer.toBinaryString(Float.floatToIntBits(Float.MAX_VALUE)); // 0 11111110 11111111111111111111111 // 输出时 开头 0 会被省略 jshell> Integer.toBinaryString(Float.floatToIntBits(Float.MIN_VALUE)); // 1 输出时,前面0会被省略 jshell> Float.MAX_VALUE // 3.4028235E38 jshell> Float.MIN_VALUE // 1.4E-45
字符集
-
ASCII (American Standard Code For Information Interchange,美国信息互换标准代码)
ASCII 1967年初版,至1986年共定义了128个字符。
ASCII 码,用一个字节来表示。 -
Unicode (统一码、万国码、单一码)
Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,规定虽有的字符和符号最少由16位来表示(2个字节),即:2 ^ 16 = 65536 -
GB2312(信息交换用汉字编码字符集)
GB2312 主要用于汉字处理以及通信。 -
UTF-8(8位元,Universal Character Set/Unicode Transformation Format)
UTF-8 是针对Unicode的一种可变长度字符编码。是对Unicode编码的压缩和优化,所以UTF-8 包含于Unicode,只是他不再使用最少使用2个字节,而是将所有的字符和符号进行分类;ascii 码中的内容用 1个字节保存、欧洲的字符用两个字节保存,东亚的字符用3个字节保存查看咱们的字符集
jshell> import java.nio.charset.Charset jshell> Charset.defaultCharset() // GBK 支持简体中文和繁体中文 GB2312 是简体中文
变量
变量是通过内存分配并赋值的量,分为不可变变量和可变变量
- 定义
int i = 6; // 定义了一个 int(整型)类型的变量 i,并且赋值为6 byte b = 6; short s = 6; long l = 6L; // 在声明long类型时,后缀加上 L 或者 l(推荐采用大写) float f = 6.6F; // 默认小数是 double 类型,声明float时 值得后缀加上 f 或 F(推荐采用大写) double d = 6.6; char c = 'G'; // 赋值给 char类型的变量,只能赋值为一个字符. boolean bool = true;
- 定义变量的规则
1. 变量名字不能有空格。
2. 避免使用关键字。如:class public static int
3. 避免使用汉字
4. 整体是驼峰命名,首字母小写。如 helloWorld
5. $ 和 _ 可以到处使用
6. 数字不能开头