java——与c++之不同——基本类型

来源:互联网 发布:js replace函数填变量 编辑:程序博客网 时间:2024/06/10 19:05

基本类型

  • 布尔型:boolean(1-bit)
  • 字符型:char(16-bit),无wchar_t类型
  • 整型:byte(8-bit),short(16-bit),int(32-bit),long(64-bit),无long long类型
  • 浮点型:float(32-bit),double(64-bit),无long double类型
  • void型:只能用于方法返回类型表示方法无返回值,不能用于方法形参列表表示形参列表为空
注1:整型都是带符号的,不区分signed和unsigned,因此无signed和unsigned关键字
注2:因为jvm原因,java跨平台,基本类型字长固定,与平台无关,因此java无sizeof运算符

字面值常量

  • char通用转义时不支持16进制
  • long型常量后缀l或L
  • 浮点型常量后缀float(f|F),double(d|D),默认为double
char c1 = 'a';    char c2 = '\n';    char c3 = '\123';    //char c4 = '\x7a';    //char c5 = '\X8b';

字面值常量类型

public static void type_check(byte b) { System.out.println("byte"); }  public static void type_check(short s) { System.out.println("short"); }public static void type_check(int i) { System.out.println("int"); } public static void type_check(long l) { System.out.println("long"); }public static void typeinfo(){    type_check(5);        type_check(-2147483648);//32位int取值下限      type_check(2147483647);//32位int取值上限      //type_check(-2147483649);//32位int取值下限-1      //type_check(2147483648);//32位int取值上限+1           //type_check(-9223372036854775808);//64位long取值下限      //type_check(9223372036854775807);//64位long取值上限      //type_check(-9223372036854775809);//64位long取值下限-1      //type_check(9223372036854775808);//64位long取值上限+1}
output:
intintint
结论:
  • 整型字面值常量允许表达范围:[-2147483648, 2147483647]([-2^31, 2^31 - 1]),因此整型字面值常量默认类型为int
  • 浮点型字面值常量默认类型为double

隐式转换

相较于c++,java以牺牲基本类型转换的灵活性换取基本类型转换的安全性,因此java允许的基本类型转换非常有限
  • boolean是独立类型,不能与算术类型相互转换,不存在true->1,false->0,非0->true,0->false的转换
  • char存放Unicode字符编码,而Unicode字符编码都是非负数,因此char取值范围为[0~2^16-1]
  • java跨平台,因此基本类型取值范围固定,算术类型取值范围顺序:byte->short->int->long->float->double
  • java基本类型隐式转换遵循安全原则(取值范围包含原则),如果一个类型取值范围是另一类型取值范围子集,则允许转换(转换过程中,数据不会丢失)
  • 遵循java安全原则,算术类型可按照byte->short->int->long->float->double顺序隐式转换,char可隐式转换为int,long,float,double,但算术类型不可转换为char(char取值范围非负数)
  • 整型字面值常量赋值给基本类型时,编译器会检查,如果整型字面值常量在目标类型取值范围内编译正确,如果超出目标类型取值范围编译error

类型提升

基本类型提升原则类似基本类型隐式转换,遵循java安全原则
  • boolean是独立类型,不能参与算术运算,因此不能提升为任何其他基本类型
  • 遵循取值范围包含原则,如果一个类型取值范围是另一类型取值范围子集,则允许提升(提升过程中,数据不会丢失)
  • 类型提升时至少提升至int开始,因此byte,short,char无条件提升至int
  • 类型提升顺序:(byte,short,char)->int->long->float->double
static void type_check(boolean b) { System.out.println("boolean"); }static void type_check(char c) { System.out.println("char"); }static void type_check(byte b) { System.out.println("byte"); }static void type_check(short s) { System.out.println("short"); }static void type_check(int i) { System.out.println("int"); }static void type_check(long l) { System.out.println("long"); }static void type_check(float f) { System.out.println("float"); }static void type_check(double d) { System.out.println("double"); }static void matchType(){    boolean flag = true;    char c = 5;    byte b = 5;    short s =5;    int i = 5;    long l = 5;    float f = 5;    double d = 5;    System.out.println("-----same type-----");    //type_check(flag + flag);    type_check(c + c);    type_check(b + b);    type_check(s + s);    type_check(i + i);    type_check(l + l);    type_check(f + f);    type_check(d + d);    System.out.println("-----char and other-----");    type_check(c + b);    type_check(c + s);    type_check(c + i);    type_check(c + l);    type_check(c + f);    type_check(c + d);    System.out.println("-----different type-----");    type_check(b + s);    type_check(s + i);    type_check(i + l);    type_check(l + f);    type_check(f + d);}
output:
-----same type-----intintintintlongfloatdouble-----char and other-----intintintlongfloatdouble-----different type-----intintlongfloatdouble
阅读全文
0 0
原创粉丝点击