一、关于用二进制描述78、-123的原码、反码、补码的作业思考
78的原码用8位二进制表示为01001110,因为正数的反码、补码和原码都相同,所以78的二进制反码、补码都是01001110;
-123的原码用8位二进制表示为11111011,原码转为反码的原则是在原码的基础上,符号位不变,其余各位取反,所以-123的反码是10000100,原码转为补码的原则是在反码的基础上加1,所以-123的补码为10000101。
二、关于byte取值范围中的-128是如何得到以及如何表示的思考
我们知道,byte的取值范围是-128~127,问题是这个-128是怎么得到的。8位二进制能组成2^8,即256个数。0~127(用二进制表示则是00000000~01111111)这个范围共128个数,那么就意味着负数部分也有128个数。
现在,我们先来用(-128)=(-1)+(-127)这种形式来分析一下-128的得到过程。
(-1)+(-127)
=[10000001](原)+[11111111](原)
=[11111110](反)+[10000000](反)
=[11111111](补)+[10000001](补)
=[10000000](补)(第9位的1被剔除了)
接着,我们会把[10000000](补)转回原码,但是结果也是10000000。也许有人以为[10000000](原)这是十进制的-0,[10000000](补)是十进制-0的补码形式,但是在补码中,真值0(注:真值是指用+、-号加绝对值来表示数值大小的数值)的表示形式是唯一的:[+0](补)=[-0](补)=00000000。所以排除[10000000](补)是0的可能性。
在上面的分析中,0~127这个范围的128个数用二进制表示是00000000~01111111,那么负数部分的128个数是不是在10000000~11111111这个范围内呢?我们来分析一下。我们已经知道10000000代表的是-128,10000001~111111111代表的是-1~-127,
所以问题也可以迎刃而解了。
三、关于“byte a =(byte)(125+5);System.out.println(a);输出结果为-126”的过程思考
在计算机系统中,数值一律用补码来表示和存储。130用8位二进制表示为10000010,其补码为11111110,对应着十进制的-126。或者,我们通过byte的取值范围(-128~127)来理解,125+2时已到达127,多出的3就转入这个取值范围的循环,从-128往数轴的正方向数,那么就是-126了。
四、关于"byte a =(byte)(125+5);System.out.println(a);结果为-126;"
和"System.out.println(Integer.toBinaryString(a));结果为11111111111111111111111110000010"的思考
java中的byte、int有正负之分,但在计算机内存中没有正负之分,只有0/1,整数(负数、正数)是用补码来表示的。正数的补码等于它的原码,负数的补码等于它的原码除了符号位之外,其余各位取反加1。
1、byte a =(byte)(125+5)中,因为java中,整数的默认计算结果是int类型(4个字节),130的补码用4字节的整型来表示:000000000000000010000010,但是byte是1字节(8位),所以就截取低8位,即10000010。但是这个补码是负数,System.out.println(a)输出的是二进制原码对应的十进制。将10000010转回原码就是11111110,即十进制的-126。这里可参考余老师的博文。
2、"System.out.println(Integer.toBinaryString(a));"中,a的值为-126,8位二进制原码为11111110,反码为10000001,补码为10000010。对于32位二进制,而且a又是负数,所以就在前面补16个1。
五、关于第二节课的总结、思考
1、包、类、变量、常量、方法的命名规范:
包名全部小写;类名首字母大写;变量名、方法名采用驼峰式命名,即除了第一个单词小写,其余单词的首字母大写;常量名全部大写。
2、类的方法之间的正确高效调用以及如何避免无效的相互调用,如:
package hellojava;
import control.Weather;
public class test {
public static void main(String[] args) {
Weather weather = new Weather();
System.out.println(weather.getCurrentWeather());
// 错误用法,又调用了一次test
weather.printName();
}
public void printName() {
System.out.println("某某");
}
}
package control;
import hellojava.test;
public class Weather {
public String getCurrentWeather(){
return "今天下雨!";
}
public void printName() {
test t = new test();
t.printName();
}
}
第一个代码weather.printName()又一次无效地调用test类中的printName方法,应该避免这个用法。
3、修饰符public、protected、private、default。在这里补充一下它们对于方法和数据的可见性:
类中成员的修饰符 | 在同一类中课访问 | 在同一包内可访问 | 在子类内可访问 | 在不同包可访问 |
public | y | y | y | y |
protected | y | y | y | |
(default) | y | y | ||
private | y |
4、用final、abstract修饰变量、方法、接口的简单应用;
5、如何编写良好的注释,采取多行注释应用于某个方法,其中应注明方法的功能,传入的参数(@param:paramName{type})、返回值类型(@return:{returnType});
6、java是强类型语言,java的反射(这里可以参考一下http://blog.csdn.net/nieweilin/article/details/5908165);
7、数据类型:
(1)jvm只能操作堆栈,不能操作寄存器;
(2)堆栈是一种数据结构:
栈空间:存储效率较高,存储基础数据类型,以“先进后出”的顺序管理数据;存储空间较少,不能存储较大的数据;
堆空间:存储效率较低,存引用数据类型,存储位置随机分配,存储大数据;
8、变量:
(1)字面量:如double pi=3.14的3.14;
(2)良好的命名规范:应语义化,首字母不大写;
(3)变量的作用域:花括号结束,jvm回收变量;
(4)java整数默认计算结果是int。eg.如果需要用long类型变量: long a = 5000000000L;
(5)原码、反码、补码的相互转换的方法
以8位二进制为例。
原码的符号位(首位):0位正,1为负。
反码:在原码的基础上,符号位不变,其余各位取反。
补码:在反码的基础上,加1。
反码、补码的符号位参与运算,原码的符号位不参与运算