黑马程序员--类型转换问题
2013-02-11 10:13
309 查看
-----------------------
android培训、java培训、java学习型技术博客、期待与您交流!
----------------------
自动类型提升与强制类型转换
类型的转换分为两种:自动类型提升和强制类型转换两种。
我们先从几个例子中进行比较:
一:自动类型转为问题
默认情况下,其顺序为:byte-->short-->int-->long-->float-->double
需要注意的是:所有的类型只要是碰到了String,则都会向String类型进行转换
例如:
intx=10;//定义一个整型变量
inty=80;//定义一个整型变量
Strings="hello";//定义一个字符串变量
System.out.println(s+x+y);//结果:hello1080;
System.out.println(x+y+s);//结果:90hello;注意两种不同结果的差别
System.out.println(s+(x+y));//结果:hello90;
友情提示:默认情况下,各个基本数据类型间是可以进行转型操作的:byte--short--int--long--float--double。但是所有的类型只要是碰到了String,则都会向String类型进行转换
二:强制类型转为问题
byteb=3;//定义一个byte类型的变量b并初始化值为3;
//b=b+4;
System.out.println(b);
这个时候我们会发现程序会报错,其原因是:4是int类型,它是由四个八位bit组成;b是byte类型,它是一个八位bit组成;这时涉及到的是:类型转换问题。所以我们需要强制转换:b=(byte)(b+4);
将int类型的结果(b+4)结果强制转换为byte类型
但是当b+=4的时候,这时又能通过编译,这时程序是:
byte b=3;//定义一个byte类型的变量b并初始化值为3;
//b=b+4;
b+=4;
System.out.println(b);
对于b+=4;这个表达式我们可以理解为:b=b+4;但是,+=是赋值运算符,赋值的是两边的和,并进行检查,底层自动进行转换动作。所以运行的时候编译器没有报错。
虽然强制类型转换可以将结果转换成你所需要的类型,但是,需要注意的问题是:容易丢失精度,一般本人不提倡使用
例如:一个int类型数据在计算机中存储的是:0000-00000000-0000 0000-0001 0000-0011
,如果要求将该int类型的数据强制转换为byte类型的数据,结果就是:0000-0011
;比较之后,很明显我们可以看出丢失了精度
我们可以来看一个例子:
byte b=3;//定义一个byte类型变量
b=(byte)(b+200);//将(b+200)的结果转换成byte类型,并赋值给b;很明显我们需要的结果是203
System.out.println(b);//输出结果b为-53
三:面试题:
byte b=3;
//b=4+7;
System.out.println(b);
对于上述的题目我们可以看出没有问题,其实这就相当于b=11;
那么我们再来看看下面的情况:
byte b=3;
byte b1=4;
byte b2=7;
b=b1+b2;
System.out.println(b);
这时候出现了这种情况:cannot convert from intto byte,为什么会出现这种情况呢?这时b=b1+b2;有人认为:b1+b2的结果和4+7的结果不是一样的吗?那么真的是一样的吗?
我们来分析一下:
(1)byte b=3;
3是int类型的数据;b是byte类型的变量,那么int类型的数据怎么赋值给byte类型的变量呢?
首先我们要明确的是:byte b=3;当编译器发现后面的数据是3时,编译器首先判断3是不是在byte的范围之内(-128~127),如果在,则默认强转并赋值给b;不在,则报错。
(2)b=b1+b2;
我们要先明确b1和b2是变量;这就意味着b1和b2的数值会变化的,也就是说b1和b2的值是不确定的,这时如果我们给b1或者b2重新赋值(b2=130;),这时的结果呢?
还有就是:b1和b2是变量;变量那么就意味着编译器无法检查。所以这时候如果你进行强制运行,那么编译器就会报错。
对于第一种情况:b=4+7;这时b右边的数值是固定的,则意味着编译器可以进行判断这个数据是否在byte范围之内。
下面我们在来看一题:
int x;
int x1=100;
int x2=108;
x=x1+x2;//
System.out.println(x);//208
这个时候运行是没有错误的,原因:
在计算机中,任何整数运算的结果还是整数。
我们在来看看另一种情况:
int x;
intx1=Integer.MAX_VALUE;
int x2=2;
x=x1+x2;
System.out.println(x);
int类型是32位类型的数据,对于超过的部分进行舍弃,这就意味着最高位就是1了,也就是负数
总结:默认int类型运算,一旦超过运算,底层则自动进行强制转换,保留自己原有位置,对于超过的部分全部舍弃。
-----------------------
android培训、java培训、java学习型技术博客、期待与您交流!
----------------------
android培训、java培训、java学习型技术博客、期待与您交流!
----------------------
自动类型提升与强制类型转换
类型的转换分为两种:自动类型提升和强制类型转换两种。
我们先从几个例子中进行比较:
一:自动类型转为问题
默认情况下,其顺序为:byte-->short-->int-->long-->float-->double
需要注意的是:所有的类型只要是碰到了String,则都会向String类型进行转换
例如:
intx=10;//定义一个整型变量
inty=80;//定义一个整型变量
Strings="hello";//定义一个字符串变量
System.out.println(s+x+y);//结果:hello1080;
System.out.println(x+y+s);//结果:90hello;注意两种不同结果的差别
System.out.println(s+(x+y));//结果:hello90;
友情提示:默认情况下,各个基本数据类型间是可以进行转型操作的:byte--short--int--long--float--double。但是所有的类型只要是碰到了String,则都会向String类型进行转换
二:强制类型转为问题
byteb=3;//定义一个byte类型的变量b并初始化值为3;
//b=b+4;
System.out.println(b);
这个时候我们会发现程序会报错,其原因是:4是int类型,它是由四个八位bit组成;b是byte类型,它是一个八位bit组成;这时涉及到的是:类型转换问题。所以我们需要强制转换:b=(byte)(b+4);
将int类型的结果(b+4)结果强制转换为byte类型
但是当b+=4的时候,这时又能通过编译,这时程序是:
byte b=3;//定义一个byte类型的变量b并初始化值为3;
//b=b+4;
b+=4;
System.out.println(b);
对于b+=4;这个表达式我们可以理解为:b=b+4;但是,+=是赋值运算符,赋值的是两边的和,并进行检查,底层自动进行转换动作。所以运行的时候编译器没有报错。
虽然强制类型转换可以将结果转换成你所需要的类型,但是,需要注意的问题是:容易丢失精度,一般本人不提倡使用
例如:一个int类型数据在计算机中存储的是:0000-00000000-0000 0000-0001 0000-0011
,如果要求将该int类型的数据强制转换为byte类型的数据,结果就是:0000-0011
;比较之后,很明显我们可以看出丢失了精度
我们可以来看一个例子:
byte b=3;//定义一个byte类型变量
b=(byte)(b+200);//将(b+200)的结果转换成byte类型,并赋值给b;很明显我们需要的结果是203
System.out.println(b);//输出结果b为-53
三:面试题:
byte b=3;
//b=4+7;
System.out.println(b);
对于上述的题目我们可以看出没有问题,其实这就相当于b=11;
那么我们再来看看下面的情况:
byte b=3;
byte b1=4;
byte b2=7;
b=b1+b2;
System.out.println(b);
这时候出现了这种情况:cannot convert from intto byte,为什么会出现这种情况呢?这时b=b1+b2;有人认为:b1+b2的结果和4+7的结果不是一样的吗?那么真的是一样的吗?
我们来分析一下:
(1)byte b=3;
3是int类型的数据;b是byte类型的变量,那么int类型的数据怎么赋值给byte类型的变量呢?
首先我们要明确的是:byte b=3;当编译器发现后面的数据是3时,编译器首先判断3是不是在byte的范围之内(-128~127),如果在,则默认强转并赋值给b;不在,则报错。
(2)b=b1+b2;
我们要先明确b1和b2是变量;这就意味着b1和b2的数值会变化的,也就是说b1和b2的值是不确定的,这时如果我们给b1或者b2重新赋值(b2=130;),这时的结果呢?
还有就是:b1和b2是变量;变量那么就意味着编译器无法检查。所以这时候如果你进行强制运行,那么编译器就会报错。
对于第一种情况:b=4+7;这时b右边的数值是固定的,则意味着编译器可以进行判断这个数据是否在byte范围之内。
下面我们在来看一题:
int x;
int x1=100;
int x2=108;
x=x1+x2;//
System.out.println(x);//208
这个时候运行是没有错误的,原因:
在计算机中,任何整数运算的结果还是整数。
我们在来看看另一种情况:
int x;
intx1=Integer.MAX_VALUE;
int x2=2;
x=x1+x2;
System.out.println(x);
int类型是32位类型的数据,对于超过的部分进行舍弃,这就意味着最高位就是1了,也就是负数
总结:默认int类型运算,一旦超过运算,底层则自动进行强制转换,保留自己原有位置,对于超过的部分全部舍弃。
-----------------------
android培训、java培训、java学习型技术博客、期待与您交流!
----------------------
相关文章推荐
- 黑马程序员——数据类型自动转换问题
- 黑马程序员——io流中数据类型转换问题
- 黑马程序员--数据类型转换问题
- 黑马程序员—Java语言基础(关键字、标识符、注释、常量与变量、进制、数据类型、类型转换、代码示例)
- SpringMVC类型转换遇到的问题
- Struts2中转换Date类型的问题
- 黑马程序员——————进制的转换和数据类型
- C++在多重继承下的指针类型强制类型转换的一些问题
- 类型转换和运算符优先级问题
- 关于ArrayList数组转换为Integer类型的报错问题
- struts2-Conveter的DefaultTypeConverter子类convertValue类型转换时只执行一次问题
- 有关linq to sql中数据类型转换问题
- 关于C++数据类型转换和格式化输出的问题
- JavaScript类型转换方法及需要注意的问题
- 黑马程序员——java数据类型的转换
- 关于MVC中无法将类型为“System.Int32”的对象强制转换为类型“System.String”的问题。
- 黑马程序员_C#类型转换复习
- DriverStudio不能转换Source中GDI_DRIVER类型问题解决
- 解决Struts2中转换Date类型的问题
- dsp调试中数据类型自动转换遇到的问题