Java语言是强类型语言,对于每一种数据都定义了明确的具体数据类型。在内存中分配了不同大小的内存空间。


内存中分配内存空间:

         byte        8位2进制    1个字节

         short      16位2进制    2个字节

         int        32位2进制    4个字节

         long       64位2进制    8个字节

         char       16位2进制    2个字节


注意:

    1.过大×××时表示长×××的数据long q = 1234567891234L

        后面加标识L,这里才会用8个字节(64)的空间对数据进行存储。

    

    2.float y=3.4f;  //小数默认的是double.

 

    3.如果char ch=a; 这里的ch就是个变量了。应该为char ch=a’;这时ch表示的字符常量a。字符型里面装一个字母, char ch=ab;这是不对的。如果是中文字是可以的,char是两个字节,char ch=; 是对的

 

    4. boolean a=true; //false 在其他语言里可以出现true+2等运算,但是Java里不可以。


    5. 定义一个字符串,是数据类型String s=abcderf; String 不是基本的数据类型,是个对象。



变量运算细节

    表达式的数据类型自动提升

       所有的byte型、short型和char的值时将被提升到int型。

       如果一个操作数是long型,计算结果就是long型;

       如果一个操作数是float型,计算结果就是float型;

       如果一个操作数是double型,计算结果就是double型。

    


1.自动类型提升(在数值类型中可以)(也叫隐式类型转换)  

       byte b = 3;

       int x = 4;

       x = x + b;  // b会自动提升为int类型进行运算。


2.强制类型转换(也叫显式类型转换)

      byte b = 3;

      b = b + 4;  // 报错(等号左边的bbyte类型。右边b加上4后,b自动提升为int  类型。类型不统一)     

      b = (byte)(b+4); //强制类型转换,强制将b+4的结果转换为byte类型,再赋值给b(用的不多,容易丢失精度)

    如果 b=127; b= (byte)(b+4);结果就是b= -125

    因为127转为byte类型,内存二进制数值为01111111,

      127+4=131,自动类型提升,内存空间为00000000  00000000  00000000  10000011,

    对131二进制取反,为1000 0011 ,对应的十进制为-125。


思考:

    byte b1=3,b2=4,b;

    b=b1+b2;

    b =b1+4;

    b=3+4;

哪句是编译失败的呢?为什么呢?


    b=b1+b2;    b =b1+4;(自动类型提升)

    这两句是错的,编译器做了一个判断,判断正确后会进行数据类型的转换,判断不正确,为了保证严谨性,会有编译错误的提示,可能损失精度。是因为b1b2是变量,因为变量的值会变化,不确定具体的值,所以默认使用int类型进行存储,可能会超出精度。