<pre name="code" class="java">/**
* 3.9 直接常量
* 所谓直接常量简单来说,就是有些数据常量,它可以表示的数据类型可能会比较歧义,比如数值5可以表示long、short、int.
* 那么java提供一些字符去标识这些常量这样,它就能明确的告诉编译器的数据类型,这样有助于内存分配不同的空间。
* 比如 题中0x177、0177、177不同的进制表示形式,表达的数值大小不是一样的,1和1f他们的大小虽然一致,但其实在内存的长度是不一样的。
* java语法提供这中标识形式,其实我觉得就是用来支持多种数值的定义,而不仅仅十进制和int类型。
*/
public class Literals{
public static void main(String[] args){
int i1 = 0x2f;
System.out.println("i1: " + Integer.toBinaryString(i1));
int i2 = 0x2F;
System.out.println("i2: " + Integer.toBinaryString(i2));
int i3 = 0177;
System.out.println("i3: " + Integer.toBinaryString(i3));
char c = 0xffff;
System.out.println("c: " + Integer.toBinaryString(c));
byte b = 0x7f;
System.out.println("b: " + Integer.toBinaryString(b));
short s= 0x7fff;
System.out.println("s: " + Integer.toBinaryString(s));
long n1 = 200L;
long n2 = 200l;
long n3 = 200;
float f1 =1;
float f2 = 1F;
float f3 = 1f;
double d1 = 1d;
double d2 = 1D;
//测试去掉前后的标识,对打印结果有何影响
int i11 = 0x2;
System.out.println("i11: " + Integer.toBinaryString(i11));
int i12 = 2;
System.out.println("i12: " + Integer.toBinaryString(i12));
int i13 = (int)2f;
System.out.println("i13: " + Integer.toBinaryString(i13));
/*
i1: 101111
i2: 101111
i3: 1111111
c: 1111111111111111
b: 1111111
s: 111111111111111
i11: 10
i12: 10
i13: 10
*/
}
/*
* 1、一个数值类数据,可以在具体数值前面或者后面添加符号,前面表示进制形式,比如0x表示是16进制,0表示8进制,没有默认为10进制。
* 后面的也可以添加符号,它表示具体的数据类型,比如f表示浮点型,l表示长整型。
* Integer.toBinaryString方法,是以二进制无符号整数形式返回一个整数参数的字符串表示形式
* i1 :0x2f 表示一个16进制,数值2,浮点型, 0020 ,预期结果 0000 0000 0010 0000 ,假如没有0x我认为它是10进制的数据,会有什么区别,好像没有;还有增加f的说明,只是决定了字符的长度并不会改变的它的值? 修正 :0010 1111
* i2: 个人觉得跟i1没有区别,因为大写F真是float的包装类。 0010
* i3: 8进制表示形式 001007007,假如没有0在前面,我们还以为是10进制177, 001111111
* c: 16进制,因为有f必须是16进制,不然系统是无法判断,不能因为这个数值表示中有f出现就认为是16进制,因为有可能只是表示float类型;这样要弄清楚java直接常量的规范是有点难啊,后面
* 最后一个f到底是数值还是表示是float?因为该数值是char,所以后面不可能表示float,就是数值 1111 1111 1111 1111,我有理由怀疑数值后面的标识都是大写才是具体类型比如i2,而小写则是数值。
* b: 0000 0000 0000 0111,1111111
* s: 0111 1111 1111 1111
*
*/
}
个人根据java的学习的对于常量表示觉的有如下规范:
1、一个具体数值可以在前面增加标识,指定它具体的进制表现形式,比如0x:16进制,0:8进制,没有话默认是10进制。
2、一个具体是指可以在后面增加表示,制定它具体的数据类型,比如F或者f表示float,D或者d表示double,L或者l表示long。
但是要注意的是,示例中 "i2= 0x2F",为什么这个f是表示的数值,而不是指定0x2是float类型,我觉得应该只有10进制的数值形式才能指定为其它非int类型的数据,比如2f。