[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数据类型分为基本数据类型和引用数据类型
结构
基本数据类型
都是直接存储在内存中的内存栈上,数据本身的值就是存储在栈空间;
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字符了解查看博客《字节为什么可以存储汉字》
特点
- 变量名指向具体的数值。
- 基础数据类型在变量声明后,立刻就会分配给他内存空间。
- 基础类型比较相等,可以使用 == 。(比较值相等,是不是同一个)
- 基本数据类型是分配在栈上的。
引用数据类型
引用类型继承与Object类,引用(即指针)是存储在有序的内存栈上,而对象本身的值存储在内存堆中。
3中引用类型
- 引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时候被指定为一个特定的类型,声明之后不能改变。
- 引用数据类型包括:类(对象)、接口、数组。
- 所有引用类型默认值都是null.
- 一个引用变量可以用于引用任何与之兼容的类型。
特点
- 变量名指向存储对象的内存地址。
- 引用数据类型在声明后分配的是内存地址,不会分配内存。
- 引用数据类型是分配在堆上的。
- 引用数据类型使用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,转换成二进制在计算机中的表示如下:
value « 1,左移1位
左移1位后换算成十进制的值为:1466367340,刚好是733183670的两倍, 有些人在乘2操作时喜欢用左移运算符来替代。
value « 8,左移8位看一下:
左移8位后变成了十进制的值为:-1283541504,移动8位后,由于首位变成了1,也就是说成了负数,在使用中要考虑变成负数的情况。
2、右移运算符:»
还是这个数:733183670
value » 1,右移1位
右移1位后换算成十进制的值为:366591835,刚好是733183670的1半, 有些人在除2操作时喜欢用右移运算符来替代
value » 8,右移8位看一下
3、无符号右移运算符:»>
无符号右移运算符»>和右移运算符»是一样的,只不过右移时左边是补上符号位,而无符号右移运算符是补上0,也就是说,对于正数移位来说等同于:»,负数通过此移位运算符能移位成正数。以-733183670»>8为例来画一下图
无符号右移运算符»的运算规则也很简单,丢弃右边指定位数,左边补上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
如图所示,其中实线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. 什么叫偏移量
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付