为什么要单独总结这两个知识点,个人感觉,无论学什么语言,这两个知识点都是基础中的基础,只要把这两个搞清楚,才能更好的学习编程(好吧,其实真正原因是被跟这些相关的bug给虐了)。
一、数据类型
1、整型数据
byte、short、int、long
其中byte有8个位,short有16位,int有32位,long是64位
其中byte的表示范围:-128-127
这里只指出byte的范围,因为把byte搞懂了,其他都一样了。
整型数据的特定是有符号位和数据位组成,符号位为最高位,0代表正数,1代表负数。而数字的表示是由数字的补码来表示,正数的补码等于原码,负数的补码是负数绝对值原码全部取反再加1,例如-127,它绝对值的原码为01111111,取反就为10000000,补码就为10000001,。
这里不禁想一个问题,-128的补码是多少?因为-128的绝对值超出了byte的范围,根据笔者验证,为10000000。这个值就是byte里面最特殊的值。
2、浮点数据
float,double
3、字符数据
char ,它要有' '括起来,如char a=‘b’;
4、布尔数据
boolean,它只有两个值true或者false
5、初始化默认值
null
还有一个数据转换的问题。具体来讲就是小范围向大范围转,比如char+int,byte向int转再跟int相加,结果也为int。但也有例外的就是强转,就是通过在数据前面加上(数据类型),就可以从大范围向小范围逆转。如 (char)('a‘+1),结果为b。
二、运算符
1、算术运算符
+ 加号 -减号 *乘号
/除号 %取模 也就是求余数
++ 自增号 如果放在数据前,就先加1再运算 ,如果放在数据后,就先运算再+1。
- - 自减号 如果放在数据前,就先减1在运算,如果放在数据后,就先运算再减1。
2、赋值运算符
赋值运算符的作用是将一个值赋予一个变量,运算顺序从右到左。
= 赋值
+=加法赋值 例如 a+=b就等于a=a+b。
-=减法赋值 例如a-=b就等于a=a-b。
*=乘法赋值 例如a*=b就等于a=a*b
/=除法赋值 例如a/=b就等于a=a/b
%=模赋值
3、关系运算符
关系运算符的作用是比较两边的运算数,结果是boolean
==等于 5==6 false
!=不等于 5!=6 true
<小于 5<6 true
>大于 5>6 false
<=小于等于 5<=6 true
>=大于等于 5>=6 falese
4、逻辑运算符
逻辑运算符是对boolean类型的表达式进行运算,结果也是boolean类型
& 与 false&true false
| 或false|true true
!非 !true false
&& 逻辑与 false&&true false
|| 逻辑或 false||true true
这里不得不提一下&&和&的区别,&&是短路判断,如果前面有一个表达式为false,后面就不执行直接返回false,而&不管什么情况都会把所有表达式执行完。
并且&也可以作为位运算符参与二进制运算。||和|的关系也是一样。
5、位运算符
~按位取反,~110变成001
&按位与,110&010等于010
|按位或,110|010等于110
^按位异或,110^010等于100
6、移位运算符
<<左移运算符
数据的所有位数向左移动,用零来补充空位,保留符号位。
>>右移运算符
数据的所有位数向右移动,用符号位来补充空位。
>>>无符号右移运算符
数据的所有位向右移动,用零来补充空位。
以下有个关于进制转化的例子,是毕老师查表法的程序,这里就引用一下。
import java.util.*;
class Trans
{
public static int scan()
{
Scanner in = new Scanner(System.in);
System.out.print("请输入十进制数字:");
int num = in.nextInt();
return num;
}
public static void trans(int num,int base,int offset)
{
if(num ==0)
{
System.out.println("\n转换后的数为:" + 0);
return ;
}
StringBuffer sa = new StringBuffer();
//这里定义16进制内都可以用到的数组
char[] ch = { '0','1','2','3',
'4','5','6','7',
'8','9','A','B',
'C','D','E','F'};
char[] arr = new char[32];
int pos = arr.length;
while(num!=0)
{
int temp = num & base;
arr[--pos] = ch[temp];
num >>>=offset;
}
for(int i=pos;i<arr.length;i++)
{
sa.append(arr[i]);
}
System.out.println("后的数为:" + sa);
}
//转换为二进制
public static void toBin(int num)
{
System.out.print("转换成二进制");
trans(num,1,1);
}
//转换为八进制
public static void toBa(int num)
{
System.out.print("转换成八进制");
trans(num,7,3);
}
//转换为十六进制
public static void toHex(int num)
{
System.out.print("转换成十六进制");
trans(num,15,4);
}
public static void main(String [] args)
{
int x = 0;
x = scan();
toBin(x);
toBa(x);
toHex(x);
}
}