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

基本类型

  • 布尔型: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:
int
int
int
结论:
  • 整型字面值常量允许表达范围:[-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-----
int
int
int
int
long
float
double
-----char and other-----
int
int
int
long
float
double
-----different type-----
int
int
long
float
double
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值