首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

Java语言中:在数据类型的讲解中补充的几个小问题

============================================================================= 1:在定义Long或者Float类型变量的时候,要加L或者f。   整数默认是int类型,浮点数默认是double。   byte,short在定义的时候,他们接收的其实是一个int类型的值。   这个是自己做了一个数据检测的,如果不再它们的范围内,就报错。 例如:     byte a = 50;  //其实50是int类型的。     short b = 100;   //其实100是int类型的。 ----------------------------------------------------------------------------- 2:byte值的问题:即默认是有符号的。   byte b1 = 127; //127   byte b2 = (byte)128; //-128   byte b3 = (byte)129; //-127   byte b4 = (byte)130; //-126   ......   byte b4 = (byte)255; //-1   byte b4 = (byte)256; //0   byte b4 = (byte)257; //+1 ---------------------------------------   byte b1 = -128; //-128   byte b2 = (byte)-129; //+127   byte b3 = (byte)-130; //+126   byte b4 = (byte)-131; //+125   ......   byte b4 = (byte)-255; //+1   byte b4 = (byte)-256; //0   byte b4 = (byte)-257; //-1 --------------------------------------- 所以有个规律是:在任何范围内,如果给个较大的值,在截取的时候,当比最大值还大的时候,又会绕回去从最小的开始。 所以有个规律是:在任何范围内,如果给个较小的值,在截取的时候,当比最小值还小的时候,又会绕回去从最大的开始。 ---------------------------------------   byte的范围:-128 ~ 127   128: 1000 0000   -128:1000 0000 (可以这样认为:这里的1即是符号位,也是数值位。)   其实1000 0000表示-0。   其实实际上byte的范围是 -127,-126,-125,...,-1,-0,+0,+1,...,+125,+126,+127   但是呢我们一般认为的是0不分正负的,所以为了区别以及为了超过范围数还能绕回去,叫做数据的回环!,就上面那样做了。 ----------------------------------------------------------------------------- 3:数据类型转换之默认转换:   byte,short,char --> int --> long --> float --> double           默认转换 但是呢?     long: 8个字节     float:4个字节 为什么long会在前面呢? --------------------------------------- 原因是:     A:它们底层的存储结构不同。所有的整数是按照1010...去存储的,但浮点数是按照科学计数法的表示的,所以存储的有效数字位以及次幂。     B:这样就导致了float表示的数据范围比long的范围要远远大。       long:-2^63 ~ 2^63-1       float:3.4*10^38 > 2*10^38 > 2*8^38 = 2*2^3^38 = 2*2^114 >> 2^63-1 --------------------------------------- Java浮点类型常量有两种表示形式:     十进制数形式,     如:3.14         314.0     科学记数法形式, 如:3.14e2    3.14*10^2   Java各整数类型有固定的表数范围和字段长度,其不受具体操作系统的影响,以保证Java程序的可移植性。   所谓的有效数字:具体地说,是指在分析工作中实际能够测量到的数字。所谓能够测量到指的是包括最后一位估计的不确定的数字。

01

Java底层-Javac编译器

当我们执行这个命令后,就会得到一个class文件,这一步其实就是编译,在前面一节我们提及到Java不同于C/C++,它首先需要将Java文件编译成class文件, 然后再由JVM将二进制文件代码转为与机器适配的机器码,而java文件编译成class文件就是由Javac编译器来完成。通常我们也叫Javac编译器为前端编译器,因为一个传统编译器编译结果是由源码到本地机器码的一个过程,而由于Javac编译器只负责源码到字节码这一步,所以叫前端编译器;字节码到本地机器码这一步是由后端运行时编译器来完成的,比如HotSpot VM中的C1、C2编译器。此外对于程序的优化也主要集中在后端运行时编译,这样可以使非Javac编译器产生Class文件(Scala,Groovy等语言的Class文件)也能享受到编译器优化的好处。

03

Java程序运行机制

Java语言是一种特殊的高级语言,它既具有解释性语言的特征,也具有编译型语言的特征,因为Java程序要经过先编译,后解释两个步骤。     可是,什么是编译型语言,什么是解释型语言呢。     编译型语言是指使用专门的编译器,针对特定平台(操作系统)将某种高级语言源代码一次性“翻译”成可被该平台硬件执行的机器码(包括机器指令和操作数),并包装成该平台所能识别的可执行性程序的格式,这个转换过程称为编译。编译生成的可执行性程序可以脱离开发环境,在特定的平台上独立运行。     现有的C、C++、Objective-C、Pascal等高级语言都属于编译型语言。     解释型语言是指使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行的语言。解释型语言通常不会进行整体性的编译和链接处理,解释型语言相当于把编译型语言中的编译和解释过程混合到一起同时完成。     可以认为:每次执行解释型语言的程序都需要进行一次编译,因此解释型语言的程序运行效率通常较低,而且不能脱离解释器独立运行。但解释型语言有一个优势:跨平台比较容易,只需提供特定平台的解释器即可,每个特定平台上的解释器负责对源代码解释成特定平台的机器指令即可。解释性语言可以方便地实现源代码级的移植,但这是以牺牲程序执行效率为代价的。     现有的Ruby、Python等语言都属于解释型语言。     Java语言比较特殊,由Java语言编写的程序需要经过编译步骤,但这个编译步骤并不会生成特定平台的机器码,而是生成一种与平台无关的字节码(也就是*.class文件)。当然,这种字节码不是可执行性的,必须使用Java解释器来解释执行。因此可以认为:Java语言既是编译型语言,也是解释型语言。或者说,Java语言既不是纯粹的编译型语言,也不是纯粹的解释性语言。Java程序的执行过程必须经过先编译、后执行两个步骤。

04
领券