Java 数据类型

打印 上一主题 下一主题

主题 619|帖子 619|积分 1867

数据在计算机内部是以二进制形式表示的,而数据有各种各样的类型(比如数值、文本、日期......),不同类型的数据具有不同的特点,如果按照统一的格式进行处理,会很不方便。
为此,高级语言引入了数据类型的概念,用于对数据进行归类,以便理解和操作。
数据类型分为基本数据类型和引用(对象)数据类型。其中,基本数据类型相当于化学中的基本元素,引用(对象)数据类型相当于元素组成的世间万物。
进制

十进制

十进制的位权为 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 取整,直到积的小数部分为零或者达到要求的精度,顺序排列。
  • 最后将整数部分和小数部分合并即可。
  1. /*
  2. 如:0.25 的二进制为 0.01
  3. 整数部分:
  4. 0 % 2 = 0 取余 0,小于 1,终止,逆序得 0
  5. 小数部分:
  6. 0.25 * 2 = 0.50  取整 0
  7. 0.50 * 2 = 1.0   取整 1,小数部分为 0,终止,顺序得 01
  8. 合并:
  9. 0.01
  10. */
复制代码
二进制转十进制

使用位权计算。
  1. /*
  2. 如:2.25 的二进制为 10.01
  3. 2.25 = 1 *(2^1)+ 0 *(2^0)+ 0 *(2^-1)+ 1 *(2^-2)
  4. */
复制代码
Java 整数的二进制表示

bit 位:计算机中表示数据的最小单位,就是二进制的一位,可取 0 或 1(电路的开关)。
Java 使用最高位(左边第一位)表示符号位,符号位为 0 表示正数,为 1 表示负数。

  • 原码,用第一位表示符号,其余位表示值。
  1. byte beVar1 = 1; // 原码:0000 0001
  2. byte beVar2 = -1; // 原码:1000 0001
复制代码

  • 反码,正数的反码等于原码,负数的反码是原码的符号位不变,其余位取反。
  1. byte beVar1 = 1; // 反码:0000 0001
  2. byte beVar2 = -1; // 反码:1111 1110
复制代码

  • 补码,正数的补码等于原码,负数的补码是在反码的基础上加 1,补码取反码再加 1 又得到原码。
  1. byte beVar1 = 1; // 补码:0000 0001
  2. byte beVar2 = -1; // 补码:1111 1111
复制代码
Java 小数的二进制表示

二进制中为表示小数,采用类似十进制的科学计数法,几乎所有的硬件和编程语言表示小数的二进制格式都是使用 IEEE 754 标准
32 位单精度二进制 = [1 个符号位] [8 个阶码位] [23 个尾数位]
64 位双精度二进制 = [1 个符号位] [11 个阶码位] [52 个尾数位]
小数 = [符号位]  [指数部分] . [小数部分]
8 位阶码位移码偏移量 127,11 位阶码位移码偏移量 1023
  1. /*
  2.   如:2.25,二进制 10.01,先化为科学计数法 1.001 * (2^1)
  3.   
  4.   32 位单精度表示:
  5.   
  6.   符号位: 0
  7.   阶码位:阶码 = 指数 + 阶码位移码偏移量 = 1 + 127 = 128,二进制 1000 0000
  8.   尾数位:尾数 = 取小数点后 23 位,001 0000 0000 0000 0000 0000
  9.   
  10.   最终得:[0][1000 0000][001 0000 0000 0000 0000 0000]
  11.   
  12.   同理可得 -2.25 的二进制:[1][1000 0000][001 0000 0000 0000 0000 0000]
  13.   
  14. */
  15. System.out.println(Integer.toBinaryString(Float.floatToIntBits(2.25F)));
  16. System.out.println(Integer.toBinaryString(Float.floatToIntBits(-2.25F)));
复制代码
基本数据类型

在 Java 中,有如下的基本数据类型。
byte 字节型

8 bit 位,占 1 个字节,取值范围 -2^7 ~ 2^7 - 1,默认值为 0。
  1. byte beVar = 100;
复制代码
short 短整型

16 bit 位,占 2 个字节,取值范围 -2^15 ~ 2^15 - 1,默认值为 0。
  1. short stVar = 200;
复制代码
int 整型

32 bit 位,占 4 个字节,取值范围 -2^31 ~ 2^31 - 1,默认值为 0,整数默认类型。
  1. int itVar = 300;
复制代码
long 长整型

64 bit 位,占 8 个字节,取值范围 -2^63 ~ 2^63 - 1,默认值为 0。
  1. long lgVar1 = 400;  // 在 int 型的取值范围内时可用,不建议,最好加上 L
  2. long lgVar2 = 400L;
复制代码
float 单精度浮点数

32 bit 位,占 4 个字节,默认值为 0.0F,不能用于表示精确值,如货币。
  1. float ftVar = 3.14F; // 浮点数默认类型是 double,必须加 F
复制代码
double 双精度浮点数

64 bit 位,占 8 个字节,默认值为 0.0D,浮点数默认类型,不能用于表示精确值,如货币。
  1. double deVar1 = 3.14;
  2. double deVar2 = 3.14E2; // 314.0
  3. double deVar3 = 3.14E-2; // 0.0314
复制代码
char 字符型

16 bit 位,可以是中文字符,使用单引号括起来,本质上是一个固定占用 2 字节的无符号正整数,对应一个 Unicode 编号,用于表示 Unicode 编号对应的字符,默认值为空字符'\u0000'。
由于固定占用两个字节,char 只能表示 Unicode 编号在 65536 以内的字符,而不能表示超出范围的字符,超出范围的字符将使用两个 char 表示。
  1. char crVar1 = '光';
  2. char crVar2 = 97; // 可以存储数字,因为 char 的本质就是无符号正整数,对应 Unicode 编号
复制代码
boolean 布尔型

布尔型只有两个取值:true 和 false,默认值为 false。
  1. boolean flag = true;
复制代码
基本数据类型转换

在 Java 中,声明变量时需要指定数据类型,JVM 会根据数据类型申请相应的内存空间,分配的空间只能存储该类型的数据。如果赋值的数据类型和声明的数据类型不一致,则需要进行数据类型转换。
布尔型不参与数据类型转换。
自动类型转换

小取值范围类型往大范围类型转自动转。
byte => short => int => long => float => double
char => int
long 的位数比 float 大,但由于 float 采用科学计数法,取值范围实际比 long 大。
  1. byte a = 10;
  2. short b = a;
  3. int c = b;
  4. long d = c;
复制代码
强制类型转换

大范围往小范围转要强转。强转可能导致数据溢出、精度丢失。
  1. float ftVar = (float)3.14159; // 浮点数字面量默认是 double 类型
复制代码
隐式类型转换
  1. /*
  2. 1、多类型混合运算时,会自动转成容量最大的数据类型,再进行计算,并返回相应类型的结果
  3.    对于整数来说,如果没有 long 型,则提升至 int 型(不管有没有 int 型变量参与)
  4. 2、在取值范围内时,整数字面量(int 型)赋值给 byte、short、char 时会自动转换
  5. 3、在取值范围内时,常量和字面量的运算结果赋值给 byte、short、char 时会自动转换
  6. 4、赋值运算(+=、-=、...)会自动进行强转
  7. 5、`char` 的运算是按 Unicode 编号进行的,在进行算术运算时会转换为 `int` 类型
  8. */
  9. byte a = 100;
  10. // a + 1 运算提升至 int 型,值在 byte 的取值范围内,但由于是变量和字面量运算,编译时不会优化,需要手动强转
  11. byte b = a + 1;
  12. final byte c = 100;
  13. // c + 1 运算提升至 int 型,值在 byte 的取值范围内,且是常量和字面量运算,编译时会优化,不需要手动强转
  14. byte d = c + 1;
  15. // 100 + 1 运算提升至 int 型,值在 byte 的取值范围内,且是字面量和字面量运算,编译时会优化,不需要手动强转
  16. byte f = 100 + 1;
复制代码
引用(对象)数据类型

除基本数据类型以外的,都是引用(对象)数据类型,如:String、数组...,引用类型的默认值是 null。
引用数据类型由基本数据类型、其他引用数据类型组成,可以理解为自定义数据类型。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

来自云龙湖轮廓分明的月亮

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表