了解原码补码反码知识
动手动脑 1:今天上Java课,老师给留的一个作业,回去自己了解原码、反码、补码,这些知识点自己大一有一些了解,但还是没有深于研究,正好借助这次作业机会,自己好好的琢磨了一番。
原码、反码和补码都是计算机对数字的二进制定点表示的方法。他们都有符号位(即开头第一个数字):正数为0,负数为1; 例如8位2进制‘5’转换成二进制就是00000101,‘-3’就表示为10000011.
难点在于他们之间的转换,转换有以下三种情况:
(1)正数:正数的原码第一位表示符号, 其余位表示值. 但是正数的原码、反码、补码相同;例如‘5’的原码、补码、反码都是00000101;
(2)负数:原码:第一位表示符号, 其余位表示值.
反码:负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
补码:负数的反码是在其原码的基础上, 符号位不变,其余各个位取反,最后加+1(只在最后一位加+1);
例如-3:原码:10000011;
反码:11111100;
补码:11111101;
(3)0:0是个特别的数它的原码、反码有两个,因为有+0和-0,但补码只有一个没有+0与-0的区分。
+0:原码:00000000; -0:原码:10000000;
反码:00000000; 反码:11111111;
补码:00000000 补码:00000000
探究Java中的数是采用上述哪种码表示的:
代码:
public class Test1 {
public static void main(String args[]) {
System.out.println("Java二进制15:"+Integer.toBinaryString(15));
System.out.println("Java二进制-15:"+Integer.toBinaryString(-15));
System.out.println("Java二进制3:"+Integer.toBinaryString(3));
System.out.println("Java二进制-3:"+Integer.toBinaryString(-3));
}
}
结果:
结论:java正数是用原码表示,负数是用补码表示。
动手动脑2:同名变量的屏蔽原则在c++接触的较多,自己课后又去了解一些关于Java的,java和c++相似,如果全局变量和局部变量名相同,会调用局部变量,如下:
在函数里,输出的也是局部变量,不是全局变量,如下:
总结:Java同名屏蔽原则概括:谁的地盘谁做主!
动手动脑3:
代码:
public class EnumTest {
public static void main(String[] args) {
Size s=Size.SMALL;
Size t=Size.LARGE;
//s和t引用同一个对象?
System.out.println(s==t); //
//是原始数据类型吗?
System.out.println(s.getClass().isPrimitive());
//从字符串中转换
Size u=Size.valueOf("SMALL");
System.out.println(s==u); //true
//列出它的所有值
for(Size value:Size.values()){
System.out.println(value);
}
}
}
enum Size{SMALL,MEDIUM,LARGE};
运行结果:
枚举类型比较之间用“==”就可以,不必用equals方法。将枚举的值赋值给令一个对象,该对象不是原始数据类型。但如果从字符串中转换,二者相同。
结论:
1、枚举类型是引用类型!
2、枚举不属于原始数据类型,它的每个具体值都引用一个特定的对象。相同的值则引用同一个对象。
3、可以使用“==”和equals()方法直接比对枚举变量的值,换句话说,对于枚举类型的变量,“==”和equals()方法执行的结果是等价的。
动手动脑4:数据类型转换
byte 1字节 8位 范围:-128~127
结论:范围大的转换位范围小的会有精度损失,而范围小的转化为大的不会有精度损失。
另一种数据类型的转换
还可以通过原始类型还客园通过包装类完成类型转换:
同一个数据需要转换为多种类型,并且这一数据需要比较长期的使用。多数情况下,推荐直接使用强制类型转换的方式。
动手动脑5:
以下代码的输出结果是什么?
int X=100;
int Y=200;
System.out.println("X+Y="+X+Y);
System.out.println(X+Y+"=X+Y");
结果:
为什么会有这样的输出结果?
原因:'+'是字符串连接符,如果+前是一个字符串,那么后面数据编译器会把它当作一个字符串类型,之间相连。
但如果前不是字符串,只是后面是字符串,前面还是原来的类型。