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、 具体例子说明