黑马程序员--类型转换问题

来源:互联网 发布:软件开发工程量清单 编辑:程序博客网 时间:2024/05/17 05:19

----------------------- 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);

这个时候我们会发现程序会报错,其原因是:4int类型,它是由四个八位bit组成;bbyte类型,它是一个八位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的结果不是一样的吗?那么真的是一样的吗?

我们来分析一下:

1byte b=3;

 3int类型的数据;bbyte类型的变量,那么int类型的数据怎么赋值给byte类型的变量呢?

首先我们要明确的是:byte b=3;当编译器发现后面的数据是3时,编译器首先判断3是不是在byte的范围之内(-128~127),如果在,则默认强转并赋值给b;不在,则报错。

2b=b1+b2;

我们要先明确b1b2是变量;这就意味着b1b2的数值会变化的,也就是说b1b2的值是不确定的,这时如果我们给b1或者b2重新赋值(b2=130;),这时的结果呢?

还有就是:b1b2是变量;变量那么就意味着编译器无法检查。所以这时候如果你进行强制运行,那么编译器就会报错。

对于第一种情况: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学习型技术博客、期待与您交流! ----------------------

 

 

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 长寿花植株长了怎么办 丽格海棠不爱长怎么办 竹节海棠太高了怎么办 绿萝叶子发黄烂根怎么办 发财树叶子发黄烂根怎么办 君子兰烂根叶子发黄怎么办 四季海棠花叶子干了怎么办 海棠花叶子枯萎枝干发黑怎么办 长寿花叶尖焦了怎么办 新买的盆栽蔫了怎么办 熬中药水太多了怎么办 秋根海棠烂根怎么办 大叶海棠烂根怎么办 玻璃海棠长得很高怎么办 玫瑰海棠叶子干焦怎么办 海棠树树干生虫怎么办 天竺葵花骨朵有虫子了怎么办? 被刺梅的刺扎了怎么办 被刺梅的刺划手了怎么办 虎刺花叶子黄了怎么办 地栽月季叶子发黄怎么办 梅花浇水浇多了怎么办 深水井底下花管进水量小怎么办 盆景对节白腊树叶尖干枯怎么办 四季海棠茎软了怎么办 玫瑰海棠烂根了怎么办 格丽海棠花腌了怎么办 养殖场不能雨污分流怎么办 药店买的药贵了怎么办 神经损伤小便少尿不出来怎么办 手指夹伤出血了怎么办 手指夹破流血了怎么办 喂了宝宝熊胆粉怎么办 不小心擦伤了皮怎么办 吃了减肥药拉肚子怎么办 遇到他心通的人怎么办 被茅山术害了怎么办 鱼缸鱼身上烂了怎么办 鳄鱼龟皮肤烂了怎么办 墨水渗透进皮肤里了怎么办 中药渗透到皮肤里怎么办