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; // 报错(等号左边的b是byte类型。右边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;(自动类型提升)
这两句是错的,编译器做了一个判断,判断正确后会进行数据类型的转换,判断不正确,为了保证严谨性,会有编译错误的提示,可能损失精度。是因为b1和b2是变量,因为变量的值会变化,不确定具体的值,所以默认使用int类型进行存储,可能会超出精度。