课堂动手动脑

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了课堂动手动脑相关的知识,希望对你有一定的参考价值。

1、枚举类型练习

技术分享

得到的结论:枚举不属于原始数据类型,枚举类型中每个元素都是不同的对象,在程序中不同的地方引用的该枚举类型的同一个值时是同一个对象

 

2、计算机中数字的编码方式

计算机中的数字是以二进制方式存储的,第一个二进制位为符号位,0代表正数,1代表负数

原码、反码、补码是计算机中存储数字使用的编码

(1)、原码、反码、补码的概念

原码:符号位加上这个数绝对值    

  例如正整数1的8位二进制原码为 00000001      负整数-1的8为二进制原码为 10000001    

反码:正数的反码就是其本身,负数的反码就是在原码的基础上除符号位外所有的位取反

  例如正整数1的8位二进制原码为 00000001  则其反码还为 00000001      

    负整数-1的8为二进制原码为 10000001  其反码为 11111110

补码:正数的补码是其本身,负数的补码为其反码再加1

  例如正整数1的8位二进制原码为 00000001  则其补码还为 00000001      

    负整数-1的8为二进制原码为 10000001  其反码为 11111110  其补码为   11111110 + 00000001 = 11111111

(2)、Java语言中的数字是以补码方式存储的

验证如下:

技术分享

 

由负整数10无符号右移一位得正2147483643可知Java中数字的存储方式为补码

分析:

如果存储方式为原码 则-10 存储的二进制表示为   10000000 00000000 00000000 00001010  无符号右移一位 得   01000000 00000000 00000000 00000101   此数十进制为 1073741829

如果存储方式为反码 则-10 存储的二进制表示为   11111111 11111111 11111111 11110101  无符号右移一位 得   01111111 11111111 11111111 11111010  此数十进制为 2147483642

如果存储方式为补码 则-10 存储的二进制表示为   11111111 11111111 11111111 11110110  无符号右移一位 得   01111111 11111111 11111111 11111011  此数十进制为 2147483643

Java中负整数10无符号右移一位得正2147483643与存储方式为补码分析出来的结果相同

所以Java中数字存储方式为补码。

 

 

3、同名变量屏蔽原则:

Java中变量遵循同名变量屏蔽原则,即如果局部定义的某个变量与全局某个变量重名时,将屏蔽全局的同名变量,引用该变量名是引用的为局部的变量

实例检验:

技术分享

分析:局部变量a与全局变量a重名,当输出变量a的值时输出的为局部的变量a的值

 

4、Java中的类型转换:

技术分享

实线为无精度损失,虚线为有精度损失

如果转换后的数据类型占的位数或其可表示的数值范围 大于 原始数据类型的位数或其可表示的数值范围 则转换过程 无 精度损失

如果转换后的数据类型占的位数或其可表示的数值范围 小于 原始数据类型的位数或其可表示的数值范围 则转换过程 有 精度损失

 

5、double类型存储不准确

浮点数在计算机中的存储方式:

符号位+指数位+尾数位

float:占4个字节 32位    则    存储方式为    符号位占1位(为31位)   指数位占8位(30-23位) 尾数位占23位(22-00位)

double:占8个字节 64位  则   存储方式为  符号位占1位(63位)  指数为占11位(62-52位)  尾数位占52位(51-00位)

浮点数在计算机中都以其二进制的科学计数法方式存储

例如 10.3  

整数部分为10   二进制表示为   1010

小数部分0.3(小数部分取二进制,乘2取整数部分,将乘2后的结果减去取出来的整数部分再乘2,一次循环,直到将乘2后的结果减去取出来的整数部分得0,依次将取出的整数部分排列即为其二进制表示方式)

0.3 * 2 = 0.6 (整数部分0)

(0.6 - 0) * 2 = 1.2 (整数部分1)

(1.2 - 1) * 2 = 0.4 (整数部分0)

(0.4 - 0) * 2 = 0.8 (整数部分0)

(0.8 - 0) * 2 = 1.6 (整数部分1)

(1.6 - 1) * 2 = 1.2(整数部分1)开始循环

所以0.3的二进制表示方式为0.010010100101001(按照01001循环)

所以10.3的二进制表示为:1010.010010100101001......

其科学计数法表示方式为:1.010010010100101001...E100     (指数为3 二进制表示为100   所以为E100)

用float类型在计算机中存储方式为:

符号位:0表示正数,1表示负数

指数位:100   在float中指数位要加上十进制的127   即二进制的 01111111

  所以指数位为     00000100 + 01111111 =    10000010     所以符号位为:10000010

尾数位:为科学计数法小数点后面的部分   0100100101001...(填满23位,如果后面不是循环的用0补全)

 

用double类型在计算机中存储方式为:

符号位:0表示正数,1表示负数

指数位:100   在float中指数位要加上十进制的1023   即二进制的 01111111111

  所以指数位为     00000000100 + 01111111111 =    10000000010     所以符号位为:10000000010

尾数位:为科学计数法小数点后面的部分   0100100101001...(填满52位,如果后面不是循环的用0补全)

由于浮点型数据的存储方式所以会造成数据不精确

 

 6、输出每个变量的值和变量的和

看下面的例子:

技术分享

在默认情况下,编译器会把‘+‘当做运算符,所以第二个输出语句X+Y的输出结果为这两个变量的和300

当前面有字符串后再加‘+‘,编译器就会把‘+‘当做字符串连接符,所以第一个输出语句X+Y中‘+‘起连接作用,所以会依次输出这两个变量的值。

以上是关于课堂动手动脑的主要内容,如果未能解决你的问题,请参考以下文章

Java课堂动手动脑--方法

课堂动手动脑

课堂动手动脑

课堂动手动脑

动手动脑(课堂作业02)

动手动脑(课堂作业05)