「JavaSE」数据类型与变量

本文详细介绍了Java中的数据类型,包括字面常量(如字符串、整型、浮点型、字符和布尔型)及其分类,基本数据类型(如整型、浮点型、字符型、布尔型以及它们的范围和表示方法),以及引用数据类型。此外,还讨论了变量的定义、类型转换(隐式和显式)以及字符串操作。文章深入探讨了二进制补码表示法,解释了为何byte类型范围是-128到127。
摘要由CSDN通过智能技术生成

目录

> 字面常量

·字面常量的分类

> 数据类型

·基本数据类型

·注意

·符号位,数值位

·为啥不是256呢?

·原码,补码,反码

·原码求补码

正数

负数

0的补码

-128的补码

·引用数据类型

> 变量

·语法格式

·变量类型

1.整型变量

2.长整型变量

3.短整型变量 

4.字节型变量 

5.浮点型变量

双精度浮点型

单精度浮点型

问题引申

浮点数的存储方式

6.字符型变量

7.布尔型变量

·类型转换 

*隐式(自动)类型转换

*显式(强制)类型转换

注意 

·类型提升

1.int与long之间

2.byte与byte类型 

·字符串类型

如何求长度

字符串加整数


> 字面常量

程序运行期间,固定不变的量称为常量。

·字面常量的分类

1.字符串常量:由“”括起来。

2.整形常量:直接写的数字(没有小数点)。

3.浮点数常量:直接写的小数。

4.字符常量:由‘’括起来。

5.布尔常量:true,false。

6.空常量:nul。

> 数据类型

主要分为两类:基本数据类型引用数据类型

·基本数据类型

四类八种,四类:整型,浮点型,字符型以及布尔型

包装类:包装类指的是基本数据类型对应的 类 类型,因为基本数据类型无法进行对象化处理,所以就引入了包装类,除了int对应的是Integer,char对应的是Character,其余的都是首字母大写即可,包装类均位于java.lang包

·注意

 Java具有可移植性:不论是在64位系统还是32位系统,int都占用4个字节,long都占用8个字节。

整型和浮点型都是带有符号的。即可以表示正数也可以表示负数

整型默认为int型,浮点型默认为double。

字符串属于引用类型

1Byte = 8bit

·符号位,数值位

举例一个byte其它以此类推:

byte 是一个字节保存的,有8个位,即8个0、1。

8 位的第一个位是符号位, 也就是说 0000 0001 代表的是数字1

1000 0000 代表的就是负数的最大值-1,所以正数最大位 0111 1111,也就是数字127

负数最大为 1111 1111,也就是数字-128,所以 Java 中的一个 byte 是 1 个字节,其范围是-128~127(128是2的7次方)

————————————————
版权声明:本文为CSDN博主「瀚海酒笑歌」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_30160343/article/details/114397396

·为啥不是256呢?

很好的问题!Java中的byte数据类型范围为-128到127是因为它使用了二进制补码表示法来表示整数。在二进制补码表示法中,最高位(最左边的位)用于表示符号,0表示正数,1表示负数。这就意味着对于一个8位的byte类型,最高位被用来表示符号位,剩下的7位用来表示数值。
如果使用0-255的范围,将无法直接使用二进制补码来表示负数,因为没有一个特定的位来表示符号。这将导致在实现正负数表示时产生混淆和复杂性。因此,为了保持二进制补码表示的一致性和简单性,Java选择了在一个8位byte中表示范围为-128到127的有符号整数。
如果你需要表示0到255的无符号整数,你可以使用Java中的其他数据类型,例如char(无符号16位整数)或者使用int等更大范围的数据类型来存储。不同的数据类型在设计上有不同的考虑和用途,根据需要选择适当的类型是很重要的。

·原码,补码,反码

计算机中的有符号数有三种表示方法,即原码反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同 。在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理 

·原码求补码

求给定数值的补码分以下两种情况:

正数

正整数的补码是其二进制表示,与原码相同 

例:+9的补码是00001001。(备注:这个+9的补码是用8位2进制来表示的,补码表示方式很多,还有16位二进制补码表示形式,以及32位二进制补码表示形式,64位进制补码表示形式等。每一种补码表示形式都只能表示有限的数字。)

负数

求负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1 

同一个数字在不同的补码表示形式中是不同的。比如-15的补码,在8位二进制中是11110001,然而在16位二进制补码表示中,就是1111111111110001。以下都使用8位2进制来表示。

例:求-5的补码。

-5对应带符号位负数5(10000101)→除符号位外所有位取反(11111010)→加 00000001为 (11111011)

所以-5的补码是11111011。

0的补码

数0的补码表示是唯一的 

[+0]补=[+0]反=[+0]原=00000000

[ -0]补=11111111+1=00000000

-128的补码

补码的计算有两种方法:
1.一个数取代数的负号运算,相当于先取反再加1,10000000先看成是负数,我们要知道它的绝对值是多少,就取反加1,可结果还是10000000。这时不能看成负数了,最高位是数值位,因此是128,所以原来是-128。
2.127是01111111,01111111+10000000=11111111,127+x=-1,=>x=-128。在八位整数里原码的取值范围为-127到+127,反码也是;在八位二进制中就把-0当作最小数-128用,也就是10000000
-0的原码:10000000
-0的反码:11111111
-128的补码:10000000

·引用数据类型

在Java中,引用类型的变量类似于C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。今天我们从以下几个方面彻底掌握java的引用类型。

可以说在java语言中除了八种基本数据类型其余都是引用类型。常见的引用类型有以下几种:

> 变量

可以经常改变的内容,数据类型就是用来定义不同种类的变量。

在Java中局部变量必须初始化。否则会报错。

·语法格式

数据类型 变量名(标识符) = 初始值;

·变量类型

1.整型变量

2.长整型变量

3.短整型变量

4.字节型变量

5.浮点型变量(单精度,双精度)

6.字符型变量

7.布尔型变量

1.整型变量

int型变量所表示的范围

 System.out.println(Integer.MAX_VALUE);
 System.out.println(Integer.MIN_VALUE);

当赋值的“字面值常量”超过了变量能存储的最大值,会自动编译报错

int不论在任何系统下都是4个字节

建议在定义时直接给出初始值,如果没有合适的初始值,可以设置为0

在给变量设置初始值时,值不能超过int的表示范围,否则会导致溢出

变量在使用之前一定要赋值,否则会报错

int型的包装类型为Integer 

2.长整型变量

定义长整型变量

 long a = 0L;

 为了区分int和long类型,一般建议long类型变量的初始值之后加L,小写也可以l,但和1不好区分

long型所能表示的范围

 System.out.println(Long.MIN_VALUE);
 System.out.println(Long.MIN_VALUE);

长整型在任何系统下都占8个字节

包装类型为Long 

3.短整型变量 

 表示范围

System.out.println(Short.MIN_VALUE);
System.out.println(Short.MIN_VALUE);

short在任何系统下都占2个字节

包装类型为Short 

4.字节型变量 

字节型变量为1字节

范围是-128~127

5.浮点型变量

双精度浮点型
int c = 3;
int d = 4;
System.out.println(c/d);

 结果是0,int除以int的值仍然是int(会直接舍弃小数部分),如果想得到0.5,需要使用double类型计算

神奇的代码

public class J829 {
    public static void main(String[] args) {
        double num = 1.1;
        System.out.println(num*num);
    }
}

 运行结果并不是1.21

小数并没有一个非常精确的数字,只能说精确到小数后几位

double类型占8个字节

double的包装类型为Double

double类型的内存布局遵循IEEE 754标准(和C语言一样),尝试使用有限的内存空间表示可能无限的小数,势必会存在一定的精度误差,因此浮点数是个近似值而不是精确值

单精度浮点型

float类型在Java中占4个字节,同样遵守IEEE 754标准,由于表示的数据范围精度较小,一般在工程上用到浮点数都优先考虑double(默认double类型),不推荐使用float类型

float num = 1.0f;
float num = 1.0F;
float num = 1.0;//这个会报错

float的包装类为Float

问题引申

类比float的报错,为什么byte b = 10;10默认为int型为什么不报错呢?

对于小于4个字节的,byte,short,赋值的字面值没有超过最大范围表示的时候,并不会解析为int型,不会报错

浮点数的存储方式

浮点数与整数在内存中的存储方式不同,不能单纯的使用2的n次方来计算

java中浮点数采用的IEEE754标准,该标准的全称为IEEE 二进制 浮点数算术标准。这个标准规定的存储格式是这样的: 符号位+指数位偏移+尾数位

IEEE 754常用的两种表示浮点数值的方式:单精确度(float 32位)、双精确度(double 64位)

 

  • 浮点数表示的数值:V = (-1)^s × M × 2^E
  • 符号(sign) :1个bit表示,当s=0,V为正数;当s=1,V为负数。
  • 阶码(exponent) :E的作用是对浮点数加权,用于存储科学计数法中的指数数据,并且采用移位存储。float类型的阶码是 8 bits,double类型的阶码是 11 bits。
  • 尾数(significand) :M是一个二进制小数,因为是二进制,所以科学计数法中这个值范围是:1≤M<2。(和十进制中范围为1~10一样)

6.字符型变量

java的字符类型采用的是Unicode编码方案,每个Unicode占用2个字节byte,16个比特bite位

 char c1 = 'A';//大写字母
 char c2 = '1';//数字字符

Java中的字符可以存放汉字,一个汉字代表两个字节,所以char类型占两个字节

char C3 = '帅';

 Java中使用 单引号+单个字母 的形式表示字符的字面值

计算机中的字符本质上是一个整数,在C语言中使用ASCLL表示字符,一个ASCLL占一个字节,而Java采用的Unicode编码占两个字节,因此Java表示的字符更多,还可以表示阿拉伯文,希腊文等

7.布尔型变量

布尔类型常用来表示真假

        boolean a = true;
        boolean b = false;

        System.out.println(a);
        System.out.println(b);

 

 boolean类型变量只有两种取值,true表示真,false表示假

Java中的boolean类型和int类型不能相互转换,不存在1表示true,0表示false这样的用法

因此boolean类型和int类型不能进行运算

Java虚拟机规范中,并没有明确规定boolean占的字节数,也没有专门用来处理boolean的字节码指令,在Oracle公司的虚拟机实现中,占1个字节

boolean的包装类型为Boolean

·类型转换 

Java中类型转换主要分为两类:自动类型转换(隐式)强制类型转换(显式)

int c = 10;
long d = 100l;
d = c;//可以通过编译
c = d;//编译失败

 在Java中,当参与运算数据类型不一致时,就会出现类型转换

*隐式(自动)类型转换

自动类型转换即:代码不需要经过任何处理,在代码编译时,编译器会自动进行处理,特点:数据范围小的转为数据范围大的会自动进行转换

        int a2 = 100;
        long b2 = 10L;
        b2 = a2;//a2和b2都是整型a2的范围小,b2的范围大,当将a2赋值给b2时,编译器会自动将a2提升为long类型,然后赋值
        a2 = b2;//编译报错,long的范围比int范围大,会有数据丢失,不安全

        float f = 3.14F;
        double g = 5.12;

        g = f;//编译器会将f转换为double,然后进行赋值
        f = g;//double表示数据范围大,直接将double交给float会有数据丢失,不安全

        byte q = 100;//编译通过,100没有超过byte的范围,编译器隐式将100转换为byte
        byte w = 257;//编译失败,257超过了byte的数据范围,有数据丢失

*显式(强制)类型转换

代码需要经过一定的格式处理,不能自动完成。数据范围大的到数据范围小的。

public class J829_2 {
    public static void main(String[] args) {
        int a = 10;
        long b = 100L;
        b = a;//数据范围由小到大,隐式转换
        a = (int)b;//由大到小,需要强制转换,否则编译失败
        double d = 5.21;
        a = d;//报错,类型不兼容
        a = (int)b;//int没有double类型表示的数据范围大,需要强制转换,小数点之后全部丢失
        boolean flag = true;
        a = flag;//编译失败,类型不兼容
        flag = a;//编译失败,类型不兼容
    }
}

注意 

不同数字类型的变量之间赋值,表示范围更小的类型能隐式转换成范围较大的类型

如果需要把范围大的类型赋值给范围小的,需要强制类型转换,但是可能精度丢失

将一个字面值常量进行赋值的时候,Java会自动针对数字范围进行检查

强制类型转换不一定能成功,不相干的类型不能互相转换

·类型提升

不同类型的数据之间相互运算时,数据类型小的会被提升为数据类型大的

1.int与long之间

int会被提升为long

public class J829_3 {
    public static void main(String[] args) {
        int a = 10;
        long b = 20;
        int c = a+b;//编译出错,a在参与运算时被自动提升为long类型,因此a+b的结果为long类型,赋值给c的时候会有数据丢失
    }
}

将c改为long类型则可编译成功

2.byte与byte类型 

由于计算机的CPU通常是按照4个字节为单位从内存中读写数据,为了硬件上实现方便,诸如byte和short这种低于4个字节的类型,会先提升为int再参与运算

·字符串类型

String不属于基本数据类型,更不属于包装类型

在Java中使用String类定义字符串类型,比如

        String s1  = "hello";
        String s2 = "world";
        System.out.println(s1+s2);//表示将s1和s2进行拼接

在C语言中,没有字符串类型,只有字符类型

Java中字符串的结尾不再有\0结尾

如何求长度

        System.out.println(s1.length());
        System.out.println(s2.length());

 

 

在有些情况下,需要将字符串和整型数字之间进行转换

        int num = 10;
        //方法一
        String str1 = num+"";
        //方法二
        String str2 = String.valueOf(num);
        //方法三
        String str3 = "345";
        int val = Integer.valueOf(str3);
        int val2 = Integer.parseInt(str3);//parseInt是valueOf的底层,也可以

        System.out.println(str1);
        System.out.println(str2);
        System.out.println(val+1);

字符串加整数

此时的加号起到拼接的作用 ,整体仍然是字符串

System.out.println("num = "+num);

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值