8种基本数据类型和三种引用类型

Posted by 麦子 on Tuesday, 2019年12月31日

[TOC]

转载地址:https://zhuanlan.zhihu.com/p/46040087

bit(比特,位)

bit是二进制数的一位包含的信息或2个选项中特别指定1个的需要信息量称为一比特,是表示信息的最小单位,只有两种状态:0和1。电脑内部的电路工作有高电平和低电平两种状态.所以就用二进制来表示信号,以便计算机识别。所以计算机能传输的最小单位当然是你信号的单位bit,而不是字节,串口最小也有一位传递的。

电脑是以二进制存储以及发送接收数据的。二进制的一位,就叫做 1 bit。也就是说 bit 的含义就是二进制数中的一个数位,即 “0” 或者 “1”。

计算机最小的存储单位是 位(bit),而一个字节等于8位即(1byte = 8bit

Byte(字节)

Byte 是字节的英文写法。它的简写为大写字母 “B"。

既然名字叫字节,那肯定跟字符有关系。是的。英文字符通常是一个字节,也就是 1B,中文字符通常是两个字节,也就是 2B。

**字节 Byte 和比特 bit 的换算关系是 1 Byte = 8 bit **

人们之所以把字节称为电脑中表示信息含义的最小单位,表示最基本的字符,是因为一个位并不能表示我们现实生活中的一个相对完整的信息。另外,内存中运算的最小存储单位是字节,位运算也是在一个字节的存储单位的基础上进行的,所以存储的最小单位可以理解为字节。

一个字节可以存储多大的数字?

一个字节有8个位,每个位有2种状态, 1和0, 于是,

如果将首位作为符号位 即1为负数 0为整数, 则一字节存的最小数为 11111111(-128),最大数为 01111111(127)

如果没有符号位则 最小数为00000000(十进制0) 最大数为11111111(十进制255)

需要注意: int(1) 和 int(10) 存储的数据没有任何区别, 因为这个int容器只有这么多字节,那么就规定了只有这么大的数据。 1 和 10 ,可能只是查询的时候显示的效果的问题。是否有无空格 或者自动填充 123 或者 000123 这样

数据类型分类

转载地址:https://www.jianshu.com/p/b9f2f497fce7

转载地址:https://www.cnblogs.com/amyzhu/p/9222412.html

java数据类型分为基本数据类型引用数据类型

结构

Xnip2020-01-01_11-18-05

基本数据类型

都是直接存储在内存中的内存上,数据本身的值就是存储在栈空间;

8种数据类型

  • 整数型(4种):byte、short、int、long、
  • 浮点型(2种):float、double
  • 字符类型(1种):char
  • 布尔类型(1种):boolean
类型 概述 范围 默认值 作用 例子
byte 8位、有符号,以二进制补码表示的整数 -2^7 ~ (2^7-1),即 -128 ~ 127 0 byte类型用在大型数组中节约空间,主要代替整数,因为byte变量占用的空间只有int的四分之一; 例子:byte a=-2
short 16位,有符号,以二进制补码表示的整数 -2^15 ~ 2^15-1, 即 -32768 ~ 32767 0 short占用空间是int的二分之一 例子:short s=-20000
int 32位、有符号,以二进制补码表示的整数 -2^31 ~ 2^31-1 0 一般整数型默认为int类型; 例子:int=-200000
long 64位、有符号,以二进制补码表示的整数 -2^63 ~ 2^63-1 0L 主要使用在需要比较大整数的系统上 例子:long a=10000L
float 32位、单精度,浮点数 浮点数不能用于表示精确的值 0.0f 在存储大型浮点数组的时候可以节省内存空间 例子:float f1=0.3f
double 64位、双精度,浮点数 double也不能表示精确的值 0.0d 浮点数的默认类型为double类型 例子:double d1=12.3
boolean 表示一位的信息 取值:true/false false 只作为一种标志类记录 true/false 情况 例子:boolean one=true
char 是一个单一的16位Unicode字符 \u0000(即0)~\uffff(65,535) ‘\u0000’ char可以存储任何字符 例子:char letter=‘A’

**注意: **对于布尔类型的数据,在内存中其实只需要一位就可以保存的,但是计算机最小的存储单位是字节,所以计算机也为布尔类型的数据分配一个字节。

Unicode字符了解查看博客《字节为什么可以存储汉字》

特点

  1. 变量名指向具体的数值。
  2. 基础数据类型在变量声明后,立刻就会分配给他内存空间。
  3. 基础类型比较相等,可以使用 == 。(比较值相等,是不是同一个)
  4. 基本数据类型是分配在栈上的。

引用数据类型

引用类型继承与Object类,引用(即指针)是存储在有序的内存栈上,而对象本身的值存储在内存堆中。

3中引用类型

  • 引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时候被指定为一个特定的类型,声明之后不能改变。
  • 引用数据类型包括:类(对象)、接口、数组。
  • 所有引用类型默认值都是null.
  • 一个引用变量可以用于引用任何与之兼容的类型。

特点

  1. 变量名指向存储对象的内存地址。
  2. 引用数据类型在声明后分配的是内存地址,不会分配内存。
  3. 引用数据类型是分配在堆上的。
  4. 引用数据类型使用equals方法去比较。(equals可以复写,比较相等,值是不是相同)

注意

不论是基本数据类型还是引用数据类型,都会在栈中分配一块内存。

位运算符

转载地址:https://www.cnblogs.com/shuaiding/p/11124974.html

概述

位运算符主要针对二进制,它包括了:“与”、“非”、“或”、“异或”。从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算。

与(&)

两个操作数中位都为1,结果才为1,否则结果为0,例如下面的程序段。

public class data13
{
  public static void main(String[] args)
  {
    int a=129;
    int b=128;
    System.out.println("a 和b 与的结果是:"+(a&b));
	}
}

运行结果
a 和b 与的结果是128

下面分析这个程序:“a”的值是129,转换成二进制就是10000001,而“b”的值是128,转换成二进制就是10000000。根据与运算符的运算规律,只有两个位都是1,结果才是1,可以知道结果就是10000000,即128。

或(|)

两个位只要有一个为1,那么结果就是1,否则就为0,下面看一个简单的例子。

public class data14
{
public static void main(String[] args)
  {
    int a=129;
    int b=128;
    System.out.println("a 和b 或的结果是:"+(a|b));
  }
}
运行结果
a 和b 或的结果是129

下面分析这个程序段: a 的值是129,转换成二进制就是10000001,而b 的值是128,转换成二进制就是10000000,根据或运算符的运算规律,只有两个位有一个是1,结果才是1,可以知道结果就是10000001,即129。

非(~)

如果位为0,结果是1,如果位为1,结果是0,下面看一个简单例子。

public class data15
{
  public static void main(String[] args)
  {
      int a=2;
      System.out.println("a 非的结果是:"+(~a));
  }
}

异或(^)

两个操作数的位中,相同则结果为0,不同则结果为1。下面看一个简单的例子。

public class data16
{
  public static void main(String[] args)
  {
      int a=15;
      int b=2;
      System.out.println("a 与 b 异或的结果是:"+(a^b));
  }
}
运行结果
a 与 b 异或的结果是13

**分析上面的程序段:**a 的值是15,转换成二进制为1111,而b 的值是2,转换成二进制为0010,根据异或的运算规律,可以得出其结果为1101 即13。

移位运算符

转载地址:https://zhuanlan.zhihu.com/p/30108890

1、左移运算符:«

先随便定义一个int类型的数int,十进制的value = 733183670,转换成二进制在计算机中的表示如下:

v2-20435c47cd9edba5421abf91947141e6_hd

value « 1,左移1位

v2-e2c197a26575ee3b068e4f5c45e8c438_hd

左移1位后换算成十进制的值为:1466367340,刚好是733183670的两倍, 有些人在乘2操作时喜欢用左移运算符来替代。

value « 8,左移8位看一下:

v2-f3df959bbf54d0c7fdfedd522d3b389d_hd

左移8位后变成了十进制的值为:-1283541504,移动8位后,由于首位变成了1,也就是说成了负数,在使用中要考虑变成负数的情况。

2、右移运算符:»

还是这个数:733183670

v2-79f1822698ccf0cd8ff3f01c47563e2d_hd

value » 1,右移1位

v2-1d486928138576e4c9e8bc8cc9cd32a8_hd

右移1位后换算成十进制的值为:366591835,刚好是733183670的1半, 有些人在除2操作时喜欢用右移运算符来替代

value » 8,右移8位看一下

v2-cfec4fd211f71a1508b47be0af91ff59_hd

3、无符号右移运算符:»>

无符号右移运算符»>和右移运算符»是一样的,只不过右移时左边是补上符号位,而无符号右移运算符是补上0,也就是说,对于正数移位来说等同于:»,负数通过此移位运算符能移位成正数。以-733183670»>8为例来画一下图

v2-5f04c1742597fa88030212c3b1fbfa54_hd

无符号右移运算符»的运算规则也很简单,丢弃右边指定位数,左边补上0。

总结

如果你要处理的数字是正数的话, 补位的就是0, 如果是负数的话就是1. 无符号右移运算符的话就是默认补的是0.

常见问题

1. 强制转换导致精度损失的问题

转载地址:https://blog.csdn.net/weixin_44736274/article/details/90769042?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

20190604145949965

如图所示,其中实线byte→short、short→int、int→long、int→double、char→int、float→double转换是不会发生精度丢失的,因为后者所包含的范围比前者大且完全包含前者

而虚线int转float、long转float,long转double都会发生精度丢失。精度丢失包括两种,一是有效数字丢失,一是目标类型完全无法表示数据

原因如下: int和float都是32位,但是内存结构也就是存储结构是不一样的,float只有24(含隐含的一位整数位)位来确定精度,而int是32位。long转float,long转double精度丢失原理是一样

2. 什么叫偏移量

「真诚赞赏,手留余香」

真诚赞赏,手留余香

使用微信扫描二维码完成支付