了解原码补码反码知识

    动手动脑 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

short    2字节    16位          范围:-32768~32767
int      4字节       32位         范围:-2147483648~2147483647
long     8字节      64位        范围:-9223372036854774808~9223372036854774807
char     2字节,c和c++是一个字节。 16位,c和c++是8位   范围:\u0000~\uFFFF
float    4字节        32位       范围:3.402823e+38 ~ 1.401298e-45
double   8字节       64位     范围:1.797693e+308~ 4.9000000e-324
boolean  1字节     8位        范围:只有true和false两个真值

 结论:范围大的转换位范围小的会有精度损失,而范围小的转化为大的不会有精度损失。

另一种数据类型的转换

还可以通过原始类型还客园通过包装类完成类型转换:

 

 

同一个数据需要转换为多种类型,并且这一数据需要比较长期的使用。多数情况下,推荐直接使用强制类型转换的方式。

 

动手动脑5:

以下代码的输出结果是什么?

int X=100;

int Y=200;

System.out.println("X+Y="+X+Y);

System.out.println(X+Y+"=X+Y");

结果:

 

 

为什么会有这样的输出结果?

原因:'+'是字符串连接符,如果+前是一个字符串,那么后面数据编译器会把它当作一个字符串类型,之间相连。

但如果前不是字符串,只是后面是字符串,前面还是原来的类型。

 

posted @ 2019-09-16 21:15  littlemelon  阅读(550)  评论(0编辑  收藏  举报