- 十进制转换成任意进制数值 ( 除基倒取余)
例如 十进制数字 83 装换成 八进制数是多少?
先用83 除以8 商10 余 3
再用10 除以8 商 1 余 2
再用 1 除以8 商 0 余 1
所以 83 转换成八进制数为 123
总结: 不断除以基数(例如这里的8),直到商为零为止, 然后倒叙取余数拼凑起来
- java 里面二进制的原码/ 反码/补码 ( 一定要记住, 之所以出现补码 是为了让计算机 计算简单)
首先这只是针对负数而言的 , 因为正数的原码/反码/补码 都是本身
负数的反码就是他的原码 除符号位外,按位取反。
负数的补码就是他的反码 +1。
补码是用来做什么的呢?
补码是用来做有负数的计算.
例如 我们byte 类型的 -1 加1 计算机怎么计算呢
首先计算机会把 -1 和1 转换成 二进制数 然后开始计算, 因为高位作为符号位,所以
-1 =1000 0001 — 1 = 0000 0001 如果将将这个两个数的二进制数 直接相加 得到的是 1000 0010
也就是 -2 肯定不是正确答案. 为了能够将十进制数转换成的二进制数,相加得到正确答案, 所以我们通过各种计算验证后发现, 将负数转换成补码再相加 的计算方式 计算机的工作量最小.即:
-1 原码 1000 0001 反码 1111 1110 补码 1111 1111
1 原反补码相同 0000 0001
(-1) + 1 = 1111 1111 + 0000 0001 = 1 0000 0000 最高位第九位 超出取值范围 舍去
- java的数据类型转换
1 整数变量 默认为INt 类型 小数变量默认为 double 类型
2 不同数据类型进行混合运算时, 默认小的数据类型 转化为大的数据类型 byte char short 直接提升为int
3 任何数据类型用 加号与字符串相连接 都会产生新的 字符串
4 java 中 char能存储 中文的 因为java 种的中文是Unicode 编码 都是占两个字节
byte char short–>int–>long–>float–>double
例一:
byte b1 = 3;
byte b2 = 4;
byte b3 = b1 + b2; (错误 编译不过 认为变量是 int 类型 )
byte b4 = 3 + 4; ( 正确 java编译器 常量优化机制)
byte b5 = 126 + 4; ( 错误 超出范围)
char c1 = ‘a’ + 1; ( 错误 )
例二:
float f = 12.2; ( 错误, 默认12.2 是double 类型)
float f = 12.2F;(正确)
例三
char c1 = ‘a’;
char c2 = 97; ( 正确)
- 那么为什么 8个字节的 Long 比 四个字节的float 标识范围要大呢
float占的4个字节,也就是32位二进制中,
第一位(最高位)是符号位,
第2-9位 是指数位
剩下的后23位是尾数位,
重点 指数位的 8位能标识0 - 255,根据IEEE 754规定,0代表0,255代表无穷大,剩下1 - 254,每个减去127,代表-126~127这个指数范围,
也就是说float的幂级数大致范围是2的-126次幂到127次幂之间,
而long是8个字节,也就是64位,除去符号位,范围在只有2的63次幂,远远小于float。
- java 中不同进制的书写规范
二进制 0B100001 (以 0B 开头)
八进制 041 (以 0 开头)
十进制 31
十六进制 0X21 (以 0X 开头)
- 局部变量被使用前 需要被赋值
// 错误案例 编译不通过
class demo{
// 编译不通过
public static void main(String[] args){
byte b = 0b00100001;
short s ;
short s1 =(short) (b + s);
}
}
- ++ a 和 a ++
a++ 是先赋值 后运算
int a = 1;
int b = (a ++) +1; 其实这里的两步是 a = 1 b = a +1 =2 然后 a= a+1= 2 b =2
++a 是先运算后赋值
int a = 2;
int b = (++a )+2 其实这里运行了两步 a= a+1 = 3 然后 a =3 b = a +2 =5例如
short s1 = 1 s1 = s + 1; (编译不过)
short s2 = 1 s2 ++ ; (编译通过 这里会自动强转的 )
- 赋值运算符 (扩展运算符)
+= , -+ , *=, /= ,%=(模等)
解释 += 办左右两边相加 然后赋值给左边
例一
int a = 3;
int a += 4; 此时 a =7
例二
short s1 = 1 s1 = s + 1; (编译不过)
short s2 = 1 s2 += 1 ; (编译通过 这里会自动强转的 )
- 位 运算符 (只要是计算机 运算肯定是转换成补码 再计算 )
,* ,& , | , ^(异或) , ~(取反) . >>(有符号右移), >>>(无符号右移), <<(左移)
class jinzhi{
public static void main(String[] args){
System.out.println(6 & 2); // 位运算
System.out.println(true & 2); // 编译错误 认为是位运算 所以true 不合法
System.out.println(true & true); // 逻辑运算
System.out.println(~6); // 输出为 -7
}
}
int a = 10 ;
int b = 5;
a = a ^ b;
b = a ^ b; // b = 10
a = a ^ b // a = 5
- switch case
1 switch 能接受的表达式 String 枚举 和 (byte short char int )
2 case 只能放常量
3. case 不能重复
- java 口直语句 跳转标号 以下代码输出值为-1 没有一点错误
public static void main(String[] args){
http://wwww.baidu.com
while(true){
b: for(;;){
System.out.println(-2>>1); // 二进制
break http;
}
}
}
- 参数传值问题
基本数据类型的传值 不改变原值 因为调用后就会弹栈 局部变量随之消失
// 输入值 为 10 -- 20
class demo {
public static void main(String[] arg){
int a = 10;
int b = 20;
change(10,20);
System.out.println(a +"--"+b);
}
public static void change(int a ,int b){
a =b;
b =a+b;
}
}
引用数据类型传值 改变值
// 输出值为 100
class demo {
public static void main(String[] arg){
int[] arr = {1,2,3};
change(arr);
System.out.println(arr[0]);
}
public static void change(int[] arr){
arr[0] = 100;
}
}
java 是传值的 因为地址也是值
- static 的特点
a. 随着类的加载而加载
b. 优先于对象存在
c. 被类的所有对象共享
d. 注意事项 ,
- 接口与接口之间可以单继承 也可以多继承
- 类与类之间 可以单继承 不可以多继承
- 多态的成员变量和方法运行结果
成员变量: 编译看左边(父类), 运行看左边(父类) 堆内存中子类的空间有一块 super空间 存储成员变量
成员方法: 编译看左边(父类), 运行看右边(子类) 也就是编译的时候 父类看有这个方法吗 , 运行的时候则运行子类的方法, 多态又称为动态绑定
静态方法: 编译看左边(父类) , 运行看左边(父类) 只有 静态的方法与类有关系, 这叫静态绑定

多态在 内存中的存储过程 图解
class intface{
public static void main(String[] args) {
Father f = new Son();
System.out.println(f.age);
f.renwu();
}
}
class Father {
int age = 50;
public void renwu(){
System.out.println("工作");
}
}
class Son extends Father {
int age = 20;
public void renwu(){
System.out.println("学习");
}
}

本文深入探讨Java中数据类型转换、位运算、赋值运算符等核心概念,解析二进制、十进制与十六进制之间的转换,以及如何在Java中正确处理不同进制的数字表示。

16万+

被折叠的 条评论
为什么被折叠?



