Java变量偏移_【java学习笔记二】java变量总结

本文详细介绍了Java中的八种基本数据类型,包括整数型(byte, int, short, long)的取值范围,浮点型(float, double)的规格化表示和取值范围,字符型(char)的初始化和Unicode编码,以及布尔型(boolean)的取值。同时,还讨论了不同类型间的自动转换和强制转换规则,以及转换中可能出现的精度损失和模变化。" 73835479,5622592,前端实现网页截图与HTML转图片方法,"['javascript', 'web', '浏览器', '网页截图']
摘要由CSDN通过智能技术生成

以下内容大部分为搜集网上各位大牛的文章整理而成,非本人所写

变量就是申请内存来存储值。也就是说,当创建变量的时候,需要在内存中申请空间。

内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据。

因此,通过定义不同类型的变量,可以在内存中储存整数、小数或者字符。

java的数据类型有八种(int,byte。long,short,double,float,char,boolean)这八种又可以分为三类,如下图所示

d047e766a1d8ba66f5018e5892ff87e9.png

第一类 整数型

1、byte

byte,即字节,由8位的二进制组成。在Java中,byte类型的数据是8位带符号的二进制数。

在计算机中,8位带符号二进制数的取值范围是[-128, 127],所以在Java中,byte类型的取值范围也是[-128, 127]。

取值范围分析

一直在想为什么不是 -128 到 128呢?今天分析了一下这个问题。

首先我们得明白一件事情,那就是运算规则:

正数的最高位都是 0 ,正数的值就是二进制表示的值。

负数的最高位都是 1 ,负数的值是 取反后加一 然后加个负号得到得值。

我们用8位的二进制来说明一下此规则:

比如:00000001。最高位是0 为正数 ,那么表示的就是 十进制的 1。

再比如:10000001.最高位是1 为负数,值是多少?取反得到 01111110 加1 得到 01111111 ,那么值为 -127

理解此运算规则我们正式开始说byte,byte正好是8位的二进制数。short是16位 int是32位 long是64位。

不难理解,byte的最大正数就是 01111111(最高位必须是0),也就是 127。

那么你可能会想 byte的最小负数就是 11111111 了,对不对? 这么想就

大错特错了。让我们看看11111111这个二进制数表示多少。

根据上面的提示 我们知道这是一个负数。它的值是先取反再加1 。

11111111取反得到:00000000,加1得到 00000001 。最后得到的值为-1.

这可是最大的负数啊。由此你是不是想到了最小的负数会不会是10000000呢?

让我们算一下 取反:01111111 加1得到 10000000 最后得到 -128.

127是01111111 然而 -128是10000000

注意:对byte类型进行数学运算时,会自动提升为int类型,如果表达式中有double或者float等类型,也是自动提升

2、int

int 数据类型是32位,有符号的以二进制补码表示的整数,最小值是 -2,147,483,648(-2^31),最大值是 2,147,483,647(2^31 – 1),一般地整型变量默认为 int 类型,默认值是 0。

3、short

short 数据类型是 16 位、有符号的以二进制补码表示的整数,最小值是 -32768(-2^15),最大值是 32767(2^15 – 1),Short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一,默认值是 0;short类型参与运算的时候,一样被提升为int或者更高的类型。(顺序为 byte short int long float double).

4、long

long 数据类型是 64 位、有符号的以二进制补码表示的整数,最小值是 -9,223,372,036,854,775,808(-2^63),最大值是 9,223,372,036,854,775,807(2^63 -1),这种类型主要使用在需要比较大整数的系统上,默认值是 0L。当需要计算非常大的数时,如果int不足以容纳大小,可以使用long类型。如果long也不够,可以使用BigInteger类。

如果我们希望它是byte型的,可以在数据后加上大写的B:35B,表示它是byte型的;同样的35S表示short型,35L表示long型的;

表示int我们可以什么都不用加,但是如果要表示long型的,就一定要在数据后面加“L”;

第二类 浮点型

1、float

float 数据类型是单精度、32位、符合IEEE 754标准的浮点数,float 在储存大型浮点数组的时候可节省内存空间,默认值是 0.0f。

规格化表示

java中的浮点数采用的事IEEE Standard 754 Floating Point Numbers标准,该标准的规范可以参考

float占用4个字节,和int是一样,也就是32bit.

第1个bit表示符号,0表示正数,1表示负数,这个很好理解,不用多管.

第2-9个bit表示指数,一共8为(可以表示0-255),这里的底数是2,为了同时表示正数和负数,这里要减去127的偏移量.这样的话范围就是(-127到128),另外全0和全1作为特殊处理,所以直接表示-126到127.

剩下的23位表示小数部分,这里23位表示了24位的数字,因为有一个默认的前导1(只有二进制才有这个特性).

最后结果是:(-1)^(sign) * 1.f * 2^(exponent)

这里:sign是符号位,f是23bit的小数部分,exponent是指数部分,最后表示范围是(因为正负数是对称的,这里只关心正数)

2^(-126) ~~ 2(1-2^(-24)) * 2^127

这个还不是float的取值范围,因为标准中还规定了非规格化表示法,另外还有一些特殊规定.非规格化表示:

当指数部分全0而且小数部分不全0时表示的是非规格化的浮点数,因为这里默认没有前导1,而是0.

取值位0.f * 2^(-126),表示范围位 2^(-149)~~ (1-2^(-23)) * 2^(-126) 这里没有考虑符号.这里为什么是-126而不是-127? 如果是-127的话,那么最大表示为

2^(-127)-2^(-149),很显然2^(-127) ~~2^(-126) 就没法表示了.

其他特殊表示

1.当指数部分和小数部分全为0时,表示0值,有+0和-0之分(符号位决定),0x00000000表示正0,0×80000000表示负0.

2.指数部分全1,小数部分全0时,表示无穷大,有正无穷和负无穷,0x7f800000表示正无穷,0xff800000表示负无穷.

3.指数部分全1,小数部分不全0时,表示NaN,分为QNaN和SNaN,Java中都是NaN.

结论:

可以看出浮点数的取值范围是:2^(-149)~~(2-2^(-23))*2^127,也就是Float.MIN_VALUE和Float.MAX_VALUE.

2、double

double 数据类型是双精度、64 位、符合IEEE 754标准的浮点数,浮点数的默认类型为double类型。

java.lang.Math中的函数都采用double类型。

如果double和float都无法达到想要的精度,可以使用BigDecimal类。

通常的浮点型的数据在不声明的情况下都是double型的;如果要表示一个数据是float型的,可以在数据后面加上“F”。

浮点型的数据是不能完全精确的,所以有的时候在计算的时候可能会在小数点最后几位出现浮动,这是正常的。

第三类 字符型

1、char

一:char的初始化

char是Java中的保留字,与别的语言不同的是,char在Java中是16位的,因为Java用的是Unicode。不过8位的ASCII码包含在Unicode中,是从0~127的。

Java中使用Unicode的原因是,Java的Applet允许全世界范围内运行,那它就需要一种可以表述人类所有语言的字符编码。Unicode。但是English,Spanish,German, French根本不需要这么表示,所以它们其实采用ASCII码会更高效。这中间就存在一个权衡问题。

因为char是16位的,采取的Unicode的编码方式,所以char就有以下的初始化方式:

char c=’c’; //字符,可以是汉字,因为是Unicode编码

char c=十进制数,八进制数,十六进制数等等; //可以用整数赋值

char c=’\u数字’; //用字符的编码值来初始化,如:char=’\0′,表示结束符,它的ascll码是0,这句话的意思和 char c=0 是一个意思。

二:关于char占几个字节的问题如下:

1:“字节”是byte,“位”是bit ;

2: 1 byte = 8 bit ;

char 在java中是2个字节。java采用unicode,2个字节(16位)来表示一个字符

java是用unicode来表示字符,”中”这个中文字符的unicode就是2个字节。

String.getBytes(encoding)方法是获取指定编码的byte数组表示,

通常gbk/gb2312是2个字节,utf-8是3个字节。

如果不指定encoding则取系统默认的encoding

第四类 布尔型

boolean数据类型表示一位的信息,只有两个取值,true 和 false,这种类型只作为一种标志来记录 true/false 情况,默认值是 false。

关于基本类型之间的转换

我们看到,将一种类型的值赋给另一种类型是很常见的。在Java中,boolean类型与所有其他7种类型都不能进行转换,这一点很明确。对于其他7中数值类型,它们之间都可以进行转换,但是可能会存在精度损失或者其他一些变化。转换分为自动转换和强制转换。对于自动转换(隐式),无需任何操作,而强制类型转换需要显式转换,即使用转换操作符(type)。首先将7种类型按下面顺序排列一下:

byte

如果从小转换到大,可以自动完成,而从大到小,必须强制转换。short和char两种相同类型也必须强制转换。

1. 自动转换

自动转换时发生扩宽(widening conversion)。因为较大的类型(如int)要保存较小的类型(如byte),内存总是足够的,不需要强制转换。如果将字面值保存到byte、short、char、long的时候,也会自动进行类型转换。注意区别,此时从int(没有带L的整型字面值为int)到byte/short/char也是自动完成的,虽然它们都比int小。在自动类型转化中,除了以下几种情况可能会导致精度损失以外,其他的转换都不能出现精度损失。

》int–> float

》long–> float

》long–> double

》float –>double without strictfp

除了可能的精度损失外,自动转换不会出现任何运行时(run-time)异常。

2.强制类型转换

如果要把大的转成小的,或者在short与char之间进行转换,就必须强制转换,也被称作缩小转换(narrowing conversion),因为必须显式地使数值更小以适应目标类型。强制转换采用转换操作符()。严格地说,将byte转为char不属于narrowing conversion),因为从byte到char的过程其实是byte–>int–>char,所以widening和narrowing都有。强制转换除了可能的精度损失外,还可能使模(overall magnitude)发生变化。

如果整数的值超出了byte所能表示的范围,结果将对byte类型的范围取余数。例如a=256超出了byte的[-128,127]的范围,所以将257除以byte的范围(256)取余数得到b=1;需要注意的是,当a=200时,此时除了256取余数应该为-56,而不是200.

将浮点类型赋给整数类型的时候,会发生截尾(truncation)。也就是把小数的部分去掉,只留下整数部分。此时如果整数超出目标类型范围,一样将对目标类型的范围取余数。

7中基本类型转换总结如下图:

3b51775c33bb5e090b5bdacc1bf15457.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值