char占几个字节?
char在设计之初的时候被用来存储字符,两个字节可以存储2^16(65536)种,这个数量符合大多数国家的语言字符个数,于是Java团队使用unicode作为编码标准,一个char作为2个字节来存储,unicode只是一个标准,具体的实现还是有如:UTF-8或UTF-16等编码。java中char占几个字节,取决于使用的编码集,如果使用ASCII编码集,则占一个字节;如果使用UTF-8编码集?
utf-8为了节省资源,采用变长编码,编码长度从1个字节到6个字节不等,英文字母占一个字节,汉字占3个字节
GBK编码表由我国发明,计算机不能在每次都只读一个字节(00000000,8位表示一个字节),要先看看第一位是不是为0,要是为0 的话,就当作ASCII码来读入一个字节,不然的话就读入两个字节(汉子太多一个字节存不下,读入两个字节表示汉字就查GBK)
boolean占几个字节?
在《Java虚拟机规范》一书中的描述:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位”。
JVM规范指出boolean当做int处理,4字节,boolean数组当做byte数组处理,1个字节
//8种数据类型
//整数型,3种表现形式:十进制、八进制(以0开头0123=83;-0123=-83)、16进制(以0X开头0Xb01e=456086)
//整形根据所占内存大小不同,分byte、short、int、long
//byte(8位,-128~127)、
// short(16位,-32768~32767)、
// int(32位,)、
// long(64位,)L
byte b=124;
//浮点型(默认为double)F(float不加F会报错)/D,两种:float(单精度浮点型,32位)、double(双精度浮点型,64位)
float f1=13.1F;
double d1=120.1D;
double d2=120.1;
//ASCII码由一个字节中的7位(bit)表示,范围是0x00 - 0x7F 共128个字符
//为了把全世界人民所有的所有的文字符号都统一进行编码,于是制定了UNICODE标准字符集,UNICODE 使用2个字节表示一个字符
//UNICODE 的范围是 0x0000 - 0xFFFF 共6万多个字符,其中汉字占用4万多
//字符型char(16位,单引号标识,'s',"s"表示字符串)
char a='a';
//字符a在码表中值位97,java可以把字符当做整数对待
char x=97;
System.out.println(a+1);//98
System.out.println((char)(a+1));//b
System.out.println("UNICODE码第23045位:"+(char)23045);//UNICODE码第23045位:娅
//转义字符,以\开头
/**
* \ddd:
* \dxxxx
* \'
* \\
* \r回车
* \n换行
* \b退格
*/
//布尔型
整数表示
//System.out.println()命令就是默认以十进制进行打印输出的
byte a=127;
System.out.println(a);
//二进制:Ob开头
int a1=0b111;
System.out.println(a1);//输出7
//八进制:0开头
int a2=0b100;
System.out.println(a2);//输出4
//十六进制:0x或0X开头
int a3=0xff;
System.out.println(a3);//输出255
//32位二进制表示5
int a4=0b00000000000000000000000000000101;
System.out.println(a4);//输出5
//32位二进制表示5的反码
int a5=0b11111111111111111111111111111010;
System.out.println(a5);//输出6
//32位二进制表示-5,即32位二进制表示5的反码+1,即补码
int a6=0b11111111111111111111111111111010+0b1;
System.out.println(a6);//输出-5
移位符
// << 左移位,不分正负数,低位补0,相当于 乘2
System.out.println(16<<2);//输出64
System.out.println(-16<<2);//输出-64
// >> 右移位,正数高位补0,负数高位补1,相当于 除2
System.out.println(16>>2);//输出4
System.out.println(16>>5);//输出0
System.out.println(-16>>2);//输出-4
System.out.println(-16>>5);//输出-1
// >>> 无符号右移/逻辑右移,不分正负数高位补0
System.out.println(16>>>2);//输出4
System.out.println(-16>>>2);//输出1073741820
逻辑运算符: &-与、|-或、!-非、^-异或
//逻辑运算符: &-与、|-或、!-非、^-异或
//&左右两边都执行
int i = 0;
if (false & (i++) > 0) {
}else{
}
if(i > 0){
System.out.println("单目&,两边都执行,i= "+i);//单目&,两边都执行,i= 1
}else{
System.out.println("单目&,只左边执行,i= "+i);
}
//|左右两边都执行
i = 0;
if(true | (i++) > 0){
}else{
}
if(i > 0){
System.out.println("单目|,两边都执行,i= "+i);//单目|,两边都执行,i= 1
}else{
System.out.println("单目|,只左边执行,i= "+i);
}
//^左右两边是相同的boolean值, 那么就是false, 不相同才是true
System.out.println("true^true========="+(true^true));//false
System.out.println("false^false========="+(false^false));//false
System.out.println("true^false========="+(true^false));//false
//&& 一旦判断到左边是false之后, 右边就不参与运算了
//||一旦判断左边是true之后, 右边就不参与运算了
/**
* 字符转字节数组
* @param c
* @return
*/
public static byte[] char2byte(char c){
byte[] b = new byte[2];
//0xFF00 计算机表示 1111 1111 0000 0000 &表示同为1则为1 >>8 右移8位 相当于去掉0000 0000,只保留前面的数值
b[0] = (byte)((c & 0xFF00) >> 8);
//0xFF 计算机表示 1111 1111 &表示同为1则为1 前面位数不够用0补
b[1] = (byte)(c & 0xFF);
return b;
}
/**
* 字节数组转字符
* @param b
* @return
*/
public static char byte2char(byte[] b){
//(b[0] & 0xFF << 8) 第一个字节
//(b[1] & 0xFF)) 第二个字节
char c = (char)((b[0] & 0xFF << 8) | (b[1] & 0xFF));
return c;
}
运算符 i+= ,i=+,i++,++i
int i=1;
System.out.println(i+=2);//3,先运算赋值再执行其他语句
int i1=1;
System.out.println(i1=+2);//2,先执行其他语句再运算赋值
int i2=1;
System.out.println(i2++);//1,先执行其他语句再运算赋值
int i3=1;
System.out.println(++i3);//2,先运算赋值再执行其他语句