数据在计算机内部是以二进制形式表示的,而数据有各种各样的类型(比如数值、文本、日期......),不同类型的数据具有不同的特点,如果按照统一的格式进行处理,会很不方便。
为此,高级语言引入了数据类型的概念,用于对数据进行归类,以便理解和操作。
数据类型分为基本数据类型和引用(对象)数据类型。其中,基本数据类型相当于化学中的基本元素,引用(对象)数据类型相当于元素组成的世间万物。
进制
十进制
十进制的位权为 10,如 123 的十进制 123,123 = 1 * (10^2) + 2 * (10^1) + 3 * (10^0)
。
二进制
二进制的位权为 2,如 4 的二进制 100,4 = 1 * (2^2) + 0 *(2^1)+ 0 *(2^0)
。
十进制转二进制
- 整数部分:除 2 取余,直到商小于 1 为止,再逆序排列。
-
小数部分:乘 2 取整,直到积的小数部分为零或者达到要求的精度,顺序排列。
-
最后将整数部分和小数部分合并即可。
/*
如:0.25 的二进制为 0.01
整数部分:
0 % 2 = 0 取余 0,小于 1,终止,逆序得 0
小数部分:
0.25 * 2 = 0.50 取整 0
0.50 * 2 = 1.0 取整 1,小数部分为 0,终止,顺序得 01
合并:
0.01
*/
二进制转十进制
使用位权计算。
/*
如:2.25 的二进制为 10.01
2.25 = 1 *(2^1)+ 0 *(2^0)+ 0 *(2^-1)+ 1 *(2^-2)
*/
Java 整数的二进制表示
bit 位:计算机中表示数据的最小单位,就是二进制的一位,可取 0 或 1(电路的开关)。
Java 使用最高位(左边第一位)表示符号位,符号位为 0 表示正数,为 1 表示负数。
- 原码,用第一位表示符号,其余位表示值。
byte beVar1 = 1; // 原码:0000 0001
byte beVar2 = -1; // 原码:1000 0001
- 反码,正数的反码等于原码,负数的反码是原码的符号位不变,其余位取反。
byte beVar1 = 1; // 反码:0000 0001
byte beVar2 = -1; // 反码:1111 1110
- 补码,正数的补码等于原码,负数的补码是在反码的基础上加 1,补码取反码再加 1 又得到原码。
byte beVar1 = 1; // 补码:0000 0001
byte beVar2 = -1; // 补码:1111 1111
Java 小数的二进制表示
二进制中为表示小数,采用类似十进制的科学计数法,几乎所有的硬件和编程语言表示小数的二进制格式都是使用 IEEE 754 标准。
32 位单精度二进制 = [1 个符号位] [8 个阶码位] [23 个尾数位]
64 位双精度二进制 = [1 个符号位] [11 个阶码位] [52 个尾数位]
小数 = [符号位] [指数部分] . [小数部分]
8 位阶码位移码偏移量 127,11 位阶码位移码偏移量 1023
/*
如:2.25,二进制 10.01,先化为科学计数法 1.001 * (2^1)
32 位单精度表示:
符号位: 0
阶码位:阶码 = 指数 + 阶码位移码偏移量 = 1 + 127 = 128,二进制 1000 0000
尾数位:尾数 = 取小数点后 23 位,001 0000 0000 0000 0000 0000
最终得:[0][1000 0000][001 0000 0000 0000 0000 0000]
同理可得 -2.25 的二进制:[1][1000 0000][001 0000 0000 0000 0000 0000]
*/
System.out.println(Integer.toBinaryString(Float.floatToIntBits(2.25F)));
System.out.println(Integer.toBinaryString(Float.floatToIntBits(-2.25F)));
基本数据类型
在 Java 中,有如下的基本数据类型。
byte 字节型
8 bit 位,占 1 个字节,取值范围 -2^7 ~ 2^7 - 1,默认值为 0。
byte beVar = 100;
short 短整型
16 bit 位,占 2 个字节,取值范围 -2^15 ~ 2^15 - 1,默认值为 0。
short stVar = 200;
int 整型
32 bit 位,占 4 个字节,取值范围 -2^31 ~ 2^31 - 1,默认值为 0,整数默认类型。
int itVar = 300;
long 长整型
64 bit 位,占 8 个字节,取值范围 -2^63 ~ 2^63 - 1,默认值为 0。
long lgVar1 = 400; // 在 int 型的取值范围内时可用,不建议,最好加上 L
long lgVar2 = 400L;
float 单精度浮点数
32 bit 位,占 4 个字节,默认值为 0.0F
,不能用于表示精确值,如货币。
float ftVar = 3.14F; // 浮点数默认类型是 double,必须加 F
double 双精度浮点数
64 bit 位,占 8 个字节,默认值为 0.0D
,浮点数默认类型,不能用于表示精确值,如货币。
double deVar1 = 3.14;
double deVar2 = 3.14E2; // 314.0
double deVar3 = 3.14E-2; // 0.0314
char 字符型
16 bit 位,可以是中文字符,使用单引号括起来,本质上是一个固定占用 2 字节的无符号正整数,对应一个 Unicode 编号,用于表示 Unicode 编号对应的字符,默认值为空字符'\u0000'
。
由于固定占用两个字节,char
只能表示 Unicode 编号在 65536 以内的字符,而不能表示超出范围的字符,超出范围的字符将使用两个 char 表示。
char crVar1 = '光';
char crVar2 = 97; // 可以存储数字,因为 char 的本质就是无符号正整数,对应 Unicode 编号
boolean 布尔型
布尔型只有两个取值:true
和 false
,默认值为 false
。
boolean flag = true;
基本数据类型转换
在 Java 中,声明变量时需要指定数据类型,JVM 会根据数据类型申请相应的内存空间,分配的空间只能存储该类型的数据。如果赋值的数据类型和声明的数据类型不一致,则需要进行数据类型转换。
布尔型不参与数据类型转换。
自动类型转换
小取值范围类型往大范围类型转自动转。
byte => short => int => long => float => double
char => int
long 的位数比 float 大,但由于 float 采用科学计数法,取值范围实际比 long 大。
byte a = 10;
short b = a;
int c = b;
long d = c;
强制类型转换
大范围往小范围转要强转。强转可能导致数据溢出、精度丢失。
float ftVar = (float)3.14159; // 浮点数字面量默认是 double 类型
隐式类型转换
/*
1、多类型混合运算时,会自动转成容量最大的数据类型,再进行计算,并返回相应类型的结果
对于整数来说,如果没有 long 型,则提升至 int 型(不管有没有 int 型变量参与)
2、在取值范围内时,整数字面量(int 型)赋值给 byte、short、char 时会自动转换
3、在取值范围内时,常量和字面量的运算结果赋值给 byte、short、char 时会自动转换
4、赋值运算(+=、-=、...)会自动进行强转
5、`char` 的运算是按 Unicode 编号进行的,在进行算术运算时会转换为 `int` 类型
*/
byte a = 100;
// a + 1 运算提升至 int 型,值在 byte 的取值范围内,但由于是变量和字面量运算,编译时不会优化,需要手动强转
byte b = a + 1;
final byte c = 100;
// c + 1 运算提升至 int 型,值在 byte 的取值范围内,且是常量和字面量运算,编译时会优化,不需要手动强转
byte d = c + 1;
// 100 + 1 运算提升至 int 型,值在 byte 的取值范围内,且是字面量和字面量运算,编译时会优化,不需要手动强转
byte f = 100 + 1;
引用(对象)数据类型
除基本数据类型以外的,都是引用(对象)数据类型,如:String、数组...,引用类型的默认值是 null
。
引用数据类型由基本数据类型、其他引用数据类型组成,可以理解为自定义数据类型。
标签:0000,int,数据类型,二进制,Java,byte,取值 From: https://www.cnblogs.com/knhap/p/17004348.html