黑马程序员-变量与数据类型转换

来源:互联网 发布:苹果手机看书软件 编辑:程序博客网 时间:2024/06/05 21:05

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

 

变量

变量的三个特点:

必须要有大小

存储一定格式的可变数据

必须要有名字

 

变量的数据类型

1.整型

         byte   代表一个字节的大小   8bit 2(8)   -128~127        256

 short  代表两个字节的大小  16bit 2(16)  -2(15)~2(15)-1

         int    代表四个字节的大小  32bit 2(32)  -2(31)~2(31)-1

         long   代表八个字节的大小  64bit 2(64)  -2(63)~2(63)-1

         如果一个数值没有采取特殊的处理,那么该整数默认的类型是int

2.浮点型

          float  代表四个字节的大小  32bit

          double 代表八个字节的大小  64bit

注意:java程序中所有的小数默认的类型是double类型,所以需要使用特殊的符号改变默认的小数类型。

3.字符型

           char   代表两个字节的大小  16bit 2(16)

           原理:将字符映射为ASCII码表中对应的十进制数据。

4.布尔型

            Boolean(只有truefalse两个值)

 代表四个字节或一个字节,当是基本的boolean时是四个字节

当是基本类型的数组时每一个boolean是一个字节。

注意:只有truefalse两个值,且不能强转成别的数据类型

 

问题1:在给long类型变量赋值时,加L和不加L有什么区别

Java中执行如下的代码:

long number =26012402244;
       
编译的时候会出现一个错误,提示过大的整数: 32322355744”,如果在Eclipse中书写上面的代码,提示的是“The literal 26012402244 of type int isout of range”。可以看出,Java代码中直接书写的数字是int类型的,就是说数字的范围在 -2^31 2^31 - 1 这个范围之中,无论将这个数字赋值给什么类型。

不过有的时候需要直接赋值大的数字,比如在测试的时候。这个时候可以使用Long.parseLong()转换下就可以啦。这个时候可以这样赋值:

long number =26012402244L;

 

需要注意的是:在Java代码中直接书写的数字是int类型的,如果给byte或者short变量赋值时,数值后面没有标识,在编译时期,编译器只会检查数值是否超出byteshort的范围,而不是检查是否超出int的范围,如果没超出,编译通过

 

同理,doublefloat类型也可不加df,注意不加的时候的值不能超过int的上限和下限

 

数据类型的自动类型提升

byte b1 = 12;在编译时期不会报错,编译器只会检查数值有没有超过byte的范围

byte b2=65+23;编译通过

byte b3=200+200;编译时期会报错,如果加byte强转,结果为-95

byte b3 = b1+10;这个编译报错,编译器在编译时期会把右边的b1自动提升为int类型,左右两边的类型不一致会发生编译错

 

byte m1 = 3;

byte m2 = 4;

byte m3 = m1+m2;这个会报错吗?

同样会报错,提示,可能会损失精度改成byte m3 = (byte)m1+m2;

编译就通过

 

int i = 4;

byte b = i;此时编译器报错,编译器在编译的阶段不能知道i的具体数值,编译器会检查两边的数据类型是否一致

 

byte b=126;

问:既然数据默认的有数据类型,那么126默认是int类型的,为什么存储到byte类型时不会报错呢。

126 是常量java在编译时期会检查该常量(每个常量)是否超出byte类型的范围。如果没有可以赋值。

 

byte b1=3b2=4b;

b=b1+b2

b=3+4

哪一句编译失败?为什么?

b =3+4,可以通过编译, 34都是常量,在编译时期已经知道值了,所以java在编译时期会检查该常量(每个常量)是否超出byte类型的范围。如果没有可以赋值。例如b=128+1就无法编译通过。b=127+1;也是无法通过。

重点是常量和变量的区别,数据类型是着重于变量

 

b =b1+b2 不可以,因为b1b2 是变量,表达式求值时,变量值会自动提升为int型,表达式结果也就成了int型,这是要赋值给byte型的b,必须进行强制类型转换了。

 

问题:为什么int类型的128的强制转换成byte类型后是-127

计算机组成原理知识,在计算机内部,二进制的最高位为1,表示负数

                                 二进制的最高位为0,表示正数

Int类型的129的二进制表示为00000000 0000 0000 0000 0000 1000 0001(最高位是0

10000001Byte只有8个二进制位                                  1000 0001(最高位是1

负数存储的是补码,如果要求原码的话就-1后取反

 10000001-0000 0001=1000 0000

取反后为0111 1111=127,原码是127,然后再加上负号“-”,所以为-127

 

问:s1= s1+1; s1+=1;与有什么不同?

对于short s1 = 1; s1 = s1 + 1;由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。

对于shorts1 = 1; s1 += 1;由于+=java语言规定的运算符,java编译器会对它进行特殊处理(加上自动转型),因此可以正确编译。

 

关于三目运算符内数据转换

publicclass Equis{        public static void main(String[] args){                char x = 'X';                int i = 0;                System.out.println(true? x : 0);                System.out.println(false ? i : x);         }}
 

 

输出结果为:

X

88

这是为什么?

 

int a=5; System.out.println("a="+((a<5)?10.9:9));/*这段代码的输出是9.0。因为三目运算符中有一个10.9,java会根据运算符的精度类型进行自动类型转换。因此9会变为9.0*/charx='x'; int i=10;System.out.println(false?i:x);System.out.println(false?100:x);/*


 

 

而这段代码的输出是

120

x

对于第一行输出,与上个例子相同,x被提升了类型,变为int

而对于第二行,由于10是一个常量。若三目运算符中的两个表达式有一个是常量表达式,另一个是类型T的表达式,且常量表达式可以被T表示,则输出结果是T类型。因此输出是字符x

*/

System.out.println(true?100:x);

/*因此这行代码将输出d,也就是100对应的char*/

 

当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?【基础】答:是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。

进制

进制是一种记数方式,可以用有限的数字符号代表所有的数值。由特定的数值组成。

 

常见的四种进制:

1)十进制:都是以0-9这九个数字组成,不能以0开头

2)二进制:由01两个数字组成。

3)八进制:由0-7数字组成,为了区分与其他进制的数字区别,开头都是以0开始

4)十六进制:由0-9A-F组成。为了区分于其他数字的区别,开头都是以ox开始

附:负数的二进制表示:

先取绝对值,然后表示为二进制,取反后加1,即为负数的表示法

总结各种进制转换

十进制à二进制    2反向取余数,直到商为0

十进制à八进制     8反向取余数,直到商为0   

十进制à十六进制   16反向取余数,直到商为0

凡是十进制转成其他进制,都是做除法,取余数

 

二进制à十进制  从最低位开始,每一位数乘于位数次方,最低位的次方为0

八进制à十进制  从最低位开始,每一位数乘于位数次方,最低位的次方为0

十六进制à十进制  从最低位开始,每一位数乘于位数次方,最低位的次方为0

范例:01112--十进制:1*2^0+1*2^1+1*2^2+0*2^3=710

任何进制转成十进制,都是做乘法

 

其中需要注意的两个转换是十六进制转成八进制和八进制转成十六进制

不能直接转,需要先转成二进制然后再转成其他进制。

 

 

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net