数据类型范围测试
一数字常数的编译问题
java 中的常量数字默认以 int 型编译
如:
- long a = 1234567890; // 十位
- long b = 12345678900; // 默认数据为 int 型, 十一位超 int 范围, 编译不过, 在 eclipse 下数字有下划线提醒
如果用到的数超过 int 型, 这里提供一下几种解决方法
1. 整数后面加 L 或者 l
long c = 12345678900L; // 加 L 或者 l 表示以 long 编译
2. 写成浮点数形式 (double 表示的范围更广)
在 java 中, 直接写整数常数, 被默认为 int 型, 整数后面加 L 可以转化成 long 型
直接写浮点常数, 被默认为 double 型, 整数后面加 f 可以转化成 float 型
double e = 12345678900.0; // 以 double 形式写数字常量, 编译可过
二 unsigned int 的处理方法
java 没有 unsigned int 类型, 笔者使用了移位的方法表示了无符号整型的最大值
private static final long UNSIGNED_INT_MAX = (1L <<32) - 1;
顺便一提, 可以用这种方法定义常量字符, 代替 C 语言的宏定义
基本数据类型介绍
基本数据类型主要有这几个:
byteshortintlongfloatdoublecharboolean
可以分为三类:
数值类型: byteshortintlongfloatdouble
字符类型: char
布尔型: boolean
byte
byte 是 8 位的数据类型, 占用 1 个字节 (8bit), 默认值是 0, 它的取值范围是 (-2^7) ~ (2^7-1), 也就是 -128 ~ 127 之间, 所以最大存储数据量是 255;
byte 一般在大型数组中使用, 来代替整数, 因为 byte 变量占用的空间只有 int 的 1/4
byte 使用示例: byte a = 10,byte=-10 在使用 byte 数据类型的时候需要注意取值范围!!!
short
short 是 16 位的数据类型, 占用 2 个字节, 默认值是 0, 它的取值范围是 (-2^15) ~(2^15-1), 也就是 -32768 ~ 32767 之间, 所以最大数据存储量是 65536;
short 虽然是 int 型变量所占空间的 1/2, 但是在实际中却很少用到在大型数组中也可以节省空间
short 使用示例: short a=100,short b=-200;
int
int 是 32 位的数据类型, 占用 4 个字节, 默认值是 0, 它的取值范围是 (-2^31) ~(2^31-1), 也就是 -2147483648 ~ 2147483647 之间, 所以最大数据存储量是 2^32-1;
int 是数据类型是整型, 是我们在项目中用到最多的数据类型之一;
int 使用示例: int a=1000,int b=-2000;
long
long 是 64 位的数据类型, 占用 8 个字节, 默认值是 0L, 它的取值范围是 (-2^63) ~(2^63-1), 也就是 -9223372036854775808 ~ 9223372036854775808 之间, 所以最大数据存储量是 2^64;
long 是数据类型是长整型, 是我们在项目中用到最多的数据类型之一在使用 long 类型的数据时最好在数值末尾带上大写的 L!
long 使用示例: long a=1000L,long b=-2000L;
float
float 是 32 位的数据类型, 占用 4 个字节, 默认值是 0, 它的取值范围是 3.4e-45 ~ 1.4e38 之间;
float 是数据类型是单精度, 在直接赋值时必须在数字后加上 f 或 F
float 使用示例: float a=10.25f, float b=-20.35F;
double
double 是 64 位的数据类型, 占用 8 个字节, 默认值是 0, 它的取值范围是 4.9e-324 ~ 1.8e308 之间;
double 是数据类型是双精度, 在直接赋值的时候最好加上 D 或 d
double 使用示例: double a=10.123d, double b= -10.25644D;
boolean
boolean 是布尔类型, 占用 1 个字节, 只有两个值, false 和 true, 默认值是 false
boolean 只能用一种标志来记录 true 或 false, 一般和 if 结合使用
boolean 使用示例: boolean a=true,boolean b=false;
char
char 是字符类型, 占用 2 个字节, 默认值为空, 取值范围 为 0~65535, 也就是 \u0000 ~ \uffff
char 数据类型可以储存任何字符
char 使用示例: char a=1,char b=A;
数值类型的级别从低到高分别为:
byte,char,short(这三个平级)>int>float>long>double
其中由低级别转到高级别, 是属于自动类型转换, 这点是由系统自动转换的
例如将 int 类型的数据转为 float 类型的数据
示例:
- int i=10;
- float j=i;
- System.out.println("i:"+i+",j:"+j);
结果:
i:10,j:10.0
如果由高级别转为低级别, 则需要强制转换, 也就是强制类型转换
例如将 int 类型的数据转换为 byte 类型的数据
示例:
- int i=127;
- int j=128;
- byte bye=(byte)i;
- byte bye2=(byte)j;
- System.out.println("i:"+i+",bye:"+bye);
- System.out.println("j:"+j+",bye2:"+bye2);
结果:
- i:127,bye:127
- j:128,bye2:-128
说明: 因为 byte 类型是 8 位, 最大值为 127, 所以当 int 强制转换为 byte 类型时, 值 128 时候就会导致溢出所以在进行强制类型转换的时候, 要注意取值范围!
在强制转换的时候需要注意数据的精确度, 否则可能会出现数据精确丢失
例如 double 类型的数据转换为 float 类型数据
示例:
- double d=10.1111115;
- float f=(float) d;
- System.out.println("f:"+f+",d:"+d);
结果:
f:10.111112,d:10.1111115
了解了数据类型的级别之后, 如果用不同的数据类型进行计算, 那么最终的数据类型又是哪一种呢?
这里我们用这几种来测试:
1.byte 类型的数据 加 short 类型的数据;
2.short 类型的数据 加 int 类型的数据;
3.int 类型的数据 加 long 类型的数据;
这里我们使用这个方法来获取最终的数据类型
- public static String getType(Object o){
- return o.getClass().toString();
代码:
- short a=1;
- byte b=2;
- int c = 3;
- long d = 4;
- System.out.println(getType(a));
- System.out.println(getType(b));
- System.out.println(getType(c));
- System.out.println(getType(d));
- System.out.println(getType(a+b));
- System.out.println(getType(a+c));
- System.out.println(getType(c+d));
结果:
- class java.lang.Short
- class java.lang.Byte
- class java.lang.Integer
- class java.lang.Long
- class java.lang.Integer
- class java.lang.Integer
- class java.lang.Long
看到结果是不是有点吃惊呢? 那么是为什么呢?
这里的不同的数值类型数据进行相加的时候, 会自动转换为级别最高的那一个
那么 short 类型的数据加 byte 类型的数据为什么是 int 类型呢?
因为在 java 的世界里, 如果比 int 类型小的类型做运算, java 在编译的时候就会将它们统一强转成 int 类型
如果上述不好理解的, 那么这里我们来做个实验测试下, 通过结果来进行验证
示例:
- short a=1,b=2;
- byte c=3,d=4;
- System.out.println(getType(a+b));
- System.out.println(getType(c+d));
结果:
- class java.lang.Integer
- class java.lang.Integer
那么这里可以得出结论, 在数值类型中, 若级别小于 int, 进行计算的时候, 最终的数据类型会自动转换为 int, 如果高于 int, 最终数据结果会取其中最高的一个!
来源: http://www.bubuko.com/infodetail-2537127.html