Java深入学习一之部分语言规范

来源:互联网 发布:数据资源管理平台 编辑:程序博客网 时间:2024/06/04 19:43

一、 java语言规范

1.标识符
标识符可以作为类名,变量名,方法名等,但不能使用关键字,布尔值和Null等,标识符以字母开头,由数字或字母构成的字符串。在这里字母是unicode字符,可以使用中文作为标识符。

    public static void main(String[] args) {        打印();    }    public static void 打印(){        System.out.println("中文方法执行");    }

2.整数
在jdk1.7后可以在数字中加入下划线分隔,0xdaDa_Cafe是合法的整数,虽然很奇怪,但是0x表示16进制,在16进制中使用0-9、a-f、A-F是合法的。
整型int的最大值用16进制表示0x7fff_ffff 为2^31-1,而0xffff_ffff表示-1,因为存储整数是以补码存储,正数补码和原码一样不变,负数补码在原码基础上取反加1。

public static void main(String[] args) {        int _a中文 = 0xdaDa_Cafe;        System.out.println(_a中文);    }//输出-623195394,由于d(1101),第一位为1,是负数

3.浮点数
float和double,单精度和双精度,32位和64位,虽然在java中int也占用32位,但是float表示范围比int高很多,这是因为float使用科学计数法。
浮点数表示规范遵循IEEE754规范
float浮点数占用32位,其中第一位为符号位(s),与int一样,接着第二位到第九位共8位表示指数位(e),其余23位表示尾数位(m)。
s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm

s为符号位,0为正,1为负,根据符号位最后乘以1或-1

e为指数位(阶码),阶码可以为正数,也可以为负数,为 了处理负指数的情况,实际的指数值按要求需要加上一个偏差(Bias)值作为保存在指数域中的值,单精度数的偏差值为127,双精度数的偏差值为 1023
实际指数0表示为127即0111_1111,实际指数-63表示为64即0100_0000

m为尾数位,表示小数,其中单精度数为23位长,双精度数为52位长。IEEE标准要求浮点数必须是规范的。这意味着尾数的小数点左侧必须为1,因此在保存尾数的时候,可以省略小数点前面这个1,从而腾出一个二进制位来保存更多的尾数。这样实 际上用23位长的尾数域表达了24位的尾数。
当数超级小时,约等于0,此时指数位全为0,为非规范浮点数,23位尾数表示的小数点前面那个数是0,就不像规范数那样是1,当然也可以用23位表示24位,只不过省略的是0,注意在转化时,尾数不用+1;
参考http://www.cnblogs.com/PerhapsLove/p/4069542.html

当指数位全为1,尾数位全为0表示无穷大,根据符号位判断是正无穷还是负无穷;尾数不全为0表示NaN(不是数字)。
指数位和尾数位全为0表示0
最大浮点数(float): 0 11111110 111111
最小正浮点数(float): 0 00000000 000001

总结:结果为:sflag*m*2^(e-127)
sflag根据符号位确定正还是负。

例子:1 10000001 010000000000000000000000
符号位为1,是负数
指数位为10000001,实际指数为129-127=2
符号位为010000 共23位,由于指数位不全为0,实际是1.01000 共24位
最后的结果为
1(1+021+122++0223)22=5

public static void main(String[] args) {        float x = -5;        System.out.println(Integer.toBinaryString(Float.floatToRawIntBits(x)));    }//控制台打印1 10000001 010000000000000000000000

Float.floatToRawIntBits()返回根据IEEE754浮点”单一格式”位布局,返回一个整数,转化为2进制就是浮点数在内存表示。
如果用正数测试时(正数一定会少0,因为符号位为0),注意将这个整数转化为2进制后,前面的0会省略,要补全0,一共32位。




以上为博主个人见解,如有错误和意见,欢迎评论

原创粉丝点击