Java 数据类型の理解

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)。
 
声明类型是获取内存中对应类型的字节,来存储输入数。若要解决问题,在等式右边最后加上L。显式提示为long类型。
 
2)   short s = 123;//(这个123也是int类型,这里,= 操作编译器能隐式转换)
    s = s + 123;//编译器报错,那是因为s+123是int类型(编译器先将s转化为int,再+123),+ 运算符等算数运算符,遇到不同类型的会自动转换。
    //这里,+ 操作编译器不能隐式转换(会提示失真,即精度可能会受损)。正确的做法:
    s = (short)(s + 123)//注意,不是(short)s + 123。
posted @ 2018-04-01 15:19  LeafLay  阅读(285)  评论(0编辑  收藏  举报