day04_计算机常识丶基本数据类型转换
计算机常识
计算机如何存储数据
- 计算机底层只能识别二进制。
- 计算机底层只识别二进制是因为计算机内部的电子元件只能识别两种状态,即开和关,或者高电平和低电平。
- 二进制正好可以用两种状态来表示数字和字符,因此成为了计算机最基本的表示方法。
- 在计算机内部,所有的数据(数字、字符、图片、声音、视频等)都被转化为二进制形式进行处理和存储。
进制
- 进制也就是进位计数制,是人为定义的带进位的计数方法
进制的分类
- 十进制: 数字组成:0-9 进位规则:逢十进一
- 二进制: 数字组成:0-1 进位规则:逢二进一
- 八进制: 数字组成:0-7 进位规则:逢八进一
- 十六进制:数字组成:0-9,a-f 进位规则:逢十六进一
不同进制之间,可以按照一定的规则相互转换
在代码中如何表示四种进制的值
// 在java中可以使用不同的字母数字组合来表示 不同进制的数但是都会以十进制的值进行输出
public class Demo01Base {public static void main(String[] args) {//(1)十进制:正常表示System.out.println(10); // 10//(2)二进制:0b或0B开头System.out.println(0B10); //2//(3)八进制:0开头System.out.println(010);//8//(4)十六进制:0x或0X开头System.out.println(0X10);//16}
}
计算机存储单位
- 字节(Byte):计算机信息技术用于计量存储容量的一种计量单位,一字节等于八位
- 位(bit):是数据存储的最小单位。也就是二进制。每个0或1就是一个位,叫做bit(比特),其中8 bit 就称为一个字节(B)
补码与符号位
计算机数据的存储使用二进制补码形式存储,并且最高位是符号位,1是负数,0是正数。规定:
正数的补码与反码、原码一样,称为三码合一;
负数的补码与反码、原码不一样:
- 负数的原码:把十进制转为二进制,然后最高位设置为1
- 负数的反码:在原码的基础上,最高位(符号位)不变,其余位取反(0变1,1变0)
- 负数的补码:反码+1
例如:byte类型(1个字节,8位)
- 25 ==>原码 0001 1001 ==> 反码 0001 1001 -->补码 0001 1001
- -25 ==>原码 1001 1001 ==> 反码1110 0110 ==>补码 1110 0111
如何存储字符
- 在计算机的内部都是二进制的0、1数据,如何让计算机可以直接识别人类文字的问题呢?就产生出了编码表的概念。
- 编码表 :就是将人类的文字和一个十进制数进行对应起来组成一张表格
将所有的英文字母,数字,符号都和十进制进行了对应,因此产生了世界上第一张编码表ASCII(American Standard Code for Information Interchange 美国标准信息交换码)。
Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
Java中使用的字符集:Unicode字符集
基本数据类型转换
- 在Java中,会存在不同类型的数据需要一起参与运算,所以这些数据类型之间是需要相互转换的
- Java语言所提供的七种数值类型之间可以相互转换,boolean类型不参与类型转换
- 基本数据类型转换有两种转换方式:自动类型转换和强制类型转换
自动类型转换(隐式类型转换)
- 将取值范围小的类型自动提升为取值范围大的类型就是自动类型转换。
把一个表示数据范围小的数值或者变量赋值给另一个表示数据范围大的变量。这种转换方式是自动的,直接书写即可
基本数据类型取值范围从小到大,如下图所示
下面情况就会发生自动类型转换
当把存储范围小的值(常量值、变量的值、表达式计算的结果值)赋值给了存储范围大的变量时
int i = 'A';//char自动升级为int
double d = 10;//int自动升级为double
当存储范围小的数据类型与存储范围大的数据类型一起混合运算时,结果是其中最大的类型
int i = 1;
byte b = 1;
double d = 1.0;double sum = i + b + d;//混合运算,升级为doubleSystem.out.println(sum);//3.0
当byte,short,char数据类型进行算术运算时,都会先转换为int类型在进行计算
byte b1 = 1;
byte b2 = 2;
// byte b3 = b1 + b2;//编译报错,b1 + b2自动升级为intchar c1 = '0';
// byte + byte + c1 --- > int + int + int ---> int
int j = b1 + b2 + c1;
System.out.println(j);//51
强制类型转换(显示类型转换)
- 将取值范围大的类型强制转换成取值范围小的类型就是强制类型转换
特点:
- 自动转换是Java自动执行的,而强制转换需要我们自己手动执行。
- 转换格式:数据类型 变量名 = (数据类型)被强转数据值
下面情况就会发生强制类型转换
当把存储范围大的值(常量值、变量的值、表达式计算的结果值)赋值给了存储范围小的变量时
int i = (int) 3.99;//强制类型转换,损失精度
System.out.println(i);//3i = 200;
byte b = (byte) i;//数据溢出
System.out.println(b);//-56
当某个值想要提升数据类型时,也可以使用强制类型转换
int x = 1;
int y = 2;
double shang = (double) x / y;
System.out.println(shang);//0.5
注意事项:
- 强制类型转换可能造成数据(丢失)溢出
- 浮点型强转成整型,直接丢掉小数部分,保留整数部分返回