java的8大基本类型:https://www.runoob.com/java/java-basic-datatypes.html
byte((字节型)):8位,最大存储数据量是255,存放的数据范围是-128~127之间。
short(短整型):16位,最大数据存储量是65536,数据范围是-32768~32767之间。
int(整型):32位,最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1。
long(长整型):64位,最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1。
float(单精度浮点型):32位,数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F。有效数位是 7 位
例如:float a=1.3; 会编译报错,正确的写法 float a = (float)1.3;或者float a = 1.3f;(f或F都可以不区分大小写)
double(双精度浮点型):64位,数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加。有效数字16位,如果不声明,默认小数为double类型
boolean(布尔型):只有true和false两个取值。
char(字符型):
字符,字符集 和字符编码:https://baike.baidu.com/item/Java%E5%AD%97%E7%AC%A6/4914060?fr=aladdin
1.用英文单引号括起来的单个字符,例如:‘a‘、‘字‘。这是最常见的声明字符形式。
2. 用英文单引号括起来的十六进制字符代码值来表示单个字符。其格式为:‘uXXXX‘,其中u是约定的前缀(u是unicode的第一个字母),而后面的XXXX位4位十六进制数,是该字符在unicode字符集中的序号。例如:‘uFFFF‘。
char:16位,char本质上是一个固定占用两个字节的无符号正整数,这个正整数对应于Unicode编号,用于表示那个Unicode编号对应的字符。由于固定占用两个字节,char只能表示Unicode编号在65 536以内的字符,而不能表示超出范围的字符。
最小值是 \u0000(即为0);
最大值是 \uffff(即为65,535)
char比较特殊:
char类型赋值
char a = ‘a‘; //任意单个字符,加单引号。
char a = ‘中‘;//任意单个中文字,加单引号。
char a = 111;//整数。如果不带引号,可以等于整数,范围是0~65535。十进制、八进制、十六进制均可。这时候的整数表示的是unicode的编码,输出的是该编号对应的iuicode字符,输出字符编码表中对应的字符,例如:char r = 65,sout(r)输出的是A,因为A在unicode中的十进制unicode编号就是65
PS:如果输入字符(如 char a = ‘ 6‘),那么输出的就是他代表的值6;但是char a = ‘ 65‘是会报错的哦,因为65有2个字符了,分别是6和5,会报错超出字符限制了。也就是想直接表达数字的,只有有一个数字 char a = ‘ 6‘
如果输入的是数字(如 char a = 65),则会输出对应的字符 A,因为A在unicode中的十进制编码就是65,其他进制的也行因为最终都会转为二进制,unicode喜欢用16进制表示,
比如: char r = 65; System.out.println(r); 那么输出的是A,因为A在unicode中对应的编码就是65,所以表示为整型时,输出的就是编码对应的字符 而汉字和字母就还是汉字 int n1 = ‘A‘; // 字母“A”的Unicodde编码是65 int n2 = ‘中‘; // 汉字“中”的Unicode编码是20013 当你使用一个整型去定义一个char型,实际指的是他代表的字符,而你用一个字符去定义一个char型,也可以得到他所代表的值。 比如: char ch1 = 49; char ch2 = ‘1‘; System.out.println(ch2); 此时输出的还是1。 这两个是等价的 ch1 == ch2 (int)ch1 == (int)ch2 还可以直接用转义字符\u+Unicode编码来表示一个字符: // 注意是十六进制: char c3 = ‘\u0041‘; // ‘A‘,因为十六进制0041 = 十进制65 char c4 = ‘\u4e2d‘; // ‘中‘,因为十六进制4e2d = 十进制20013
二进制转为十进制计算
从二进制数的最右数起,最右方的第一个数乘以2的0次方,第二个数乘以2的1次方……依次类推,把各结果累计相加就是转换后的十进制数。
例如:00100000
左侧数1的右侧还有5位,那么就是1*2的五次方=64,因为其他数字是0,乘了也是0,我就省略了
01000001
左侧第二个1右侧还有6位数,最后一个1右侧还有0个数
1*2六次方+1*2的零次方=65
编码unicode utf-8编码详解
编码的好文章:
https://blog.csdn.net/Deft_MKJing/article/details/79460485
https://blog.csdn.net/qq_22771739/article/details/84261165
在Java中做一个总结:
在我们编译器把java源文件编译成.class文件的时候需要用到文件的编码,我们一般设置成UTF-8,如果文件是其他编码就有可能出现错误,之前的一片博文里面就有提到字符编码集导致的错误。但一旦编译成.class文件开始,就不用在乎关于我们程序源码的什么UTF-8编码了,因为已经完成了从UTF-8编码的文件转成与平台无关的.class文件了,也就是说已经把根据UTF-8编码方式转成了Unicode。
引用下别人博客中的内容:
在Java(其中主要包括在JVM中、内存中、在代码里声明的每一个char、String类型的变量中。)中字符只以一种形式存在,那就是Unicode,不选择任何特定的编码,直接使用它们在字符集中的编号,这是统一的唯一的方法。
在JVM内部,统一使用Unicode表示,当着字符从JVM内部移动到外部时(即保存为文件系统中的一个文件内容时),就进行了编码转换,使用了具体的编码方案。因此也可以说,所有的编码转换只发生在边界的地方,也就是各种输入/输出流的起作用的地方。
2.UTF-8编码方式
注意:UTF-8编码方式是一种文件的存储方式,只发生在边界的地方,也就是各种输入/输出流的起作用的地方。
粘贴一篇别人的博文:
我们知道,计算机内部,所有信息最终都是一个二进制值。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从00000000到11111111。
上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为 ASCII 码,一直沿用至今。
ASCII 码一共规定了128个字符的编码,比如空格SPACE是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的一位统一规定为0。
原文:https://www.cnblogs.com/cherishforchen/p/13359694.html