1、数据类型分为内置类型和引用类型,等等基础概念,不再详细阐述,很多博客上面有进行介绍。
2、Something About Integer
Java (JVM)中看到不带小数点的数(即整数),则默认将该值分为int 类型。若需存储足够大的整数,=> long number = 88888888L ;
Q1:byte 所占为1 btye = 8 bit , 为毛其是范围:-2的7次方~2的7次方-1(1111,1111~0111,1111),即-128~127?
A1:整数为带符号的数,最高位在0、1代码中表示符号位 (0正1负),余下7位来根据十进制=>二进制关系,来存放该数的绝对值。
Q2:既然所有整数视为int ,为毛还需引入不同的数据类型?
A2:例如,
byte
类型虽然在语义(逻辑)上是占用
1
字节,但实际上,JVM中是将其当做
int
看
的,也就是事实上是占用了
32
位,
4
字节的,所以其运算效率和
int
没区别,
short
也一样。
之所以要有
byte
/
short
类型,一是因为某些地方要明确使用这些范围类型(个人理解为给人看的,而非给机器声明,因为机器为默认分配4 byte.)。二是,
在
byte
[]数组中,JVM存储的则是真的
1
字节,
short
[]
2
字节。(但也有的JVM其
byte
[]
数组也是
4
字节
1
位)
Q3:十进制、八进制、十六进制整数区别?
A3:对于同一个数(10),三者(十进制:10,十六进制:A,八进制:12)在内存中都是0、1代码,只不过是根据其进制对应法则,展示的效果不同而已。默认int a= 10 ,是按十进制格式输入输出。也可以输出八进制 int a =012 (数字前面加0,表示八进制格式) 、十六进制 int b =0xA(对应数字前加0x 或者 0X,表示十六进制格式)。
Q4:
char b = 'a' + 18;
char a = 'a' ;
char b = a + 18;
前者语句不报错,后者语句报错:错误:不兼容的类型。为毛?
A4:关于第一句 字符常量'a' 使用Unicode , 实际存储是转换为整数特定值来代表该字符,整数之间可以进行运算,将运算完的结果再转换为char 对应字符输出。(逻辑上可以这样理解)
第一句的,其他理解是:javac在编译的时候就直接把 char b = 'a' + 18 编译成 char b = 's' 了 。 (p.s.两种理解方式,本人未学过汇编,具体机器执行过程不清楚,第二种更准确更深入。)
关于第二句:a 是变量,jvm不知道具体的a是多少,所以进行算数运算的时候,会自动把char类型的'a'转为int类型的97,然后在进行算数运算,之后就需要强转为char了。
若需解决第二局的错误,进行强制类型转换。
char a = 'a' ;
char b = (char)(a+18);
3、 具体例子说明
1) long
number =
0xfffffffffff
;
//0x表示这个数是16进制数,0表示8进制。
//编译器报错,因为右边默认是int,但其超出了范围(没超出int范围的话
//编译器会隐式将int转为long),故报错(同样的错误也会出现在float)。
short
s =
123
;
//(这个123也是int类型,这里,= 操作编译器能隐式转换)
s = s +
123
;
//编译器报错,那是因为s+123是int类型(编译器先将s转化为int,再+123),+ 运算符等算数运算符,遇到不同类型的会自动转换。
//这里,+ 操作编译器不能隐式转换(会提示失真,即精度可能会受损)。正确的做法:
s = (
short
)(s +
123
)
//注意,不是(short)s + 123。