写点什么

Java 编程基础

用户头像
michaelliu
关注
发布于: 2020 年 05 月 13 日

基本数据类型



| 类型名 | 字节长度 | 示例 |

| --- | --- | --- |

| byte | 1 | byte b = 22 |

| short | 2 | short s = 1 |

| int | 4 | int i = 10 |

| long | 8 | long l = 1000L |

| float | 4 | float f = 33.33f |

| double | 8 | double d = 33.33 |

| boolean | 虚拟机确定 | boolean b = true |

| char | 2 | char c = ‘A’ |



  • 数字常量默认为 int 类型

  • 小数常量默认为 double 类型

  • boolean 变量默认是 false



小数计算结果不精确



无论是使用 float 还是 double,进行运算时都会出现计算结果与预期不符的情况,下面看看



public class Test {
public static void main(String[] args) {
double d = 0.1 * 0.1;
System.out.println(d); // 0.010000000000000002
float f = 0.1f * 0.1f;
System.out.println(f); // 0.010000001
}
}

可以看到 d 的预期结果是 0.01,但实际结果是 0.010000000000000002;f 的预期结果是 0.01,但实际结果是 0.010000001。解决办法是使用 BigDecimal 来进行计算



public class Test {
public static void main(String[] args) {
BigDecimal d = new BigDecimal("0.1").multiply(new BigDecimal("0.1")) ;
System.out.println(d.floatValue()); // 0.01
}
}



二进制



原码



「原码」就是符号位加上数字的二进制表示,最左边第一位表示符号 (0正数 1负数)。



  • 1 的原码为:00000001

  • -1 的原码为: 10000001



反码



一个数如果为正,则它的反码与原码相同;一个数如果为负,则符号位为 1 不变,其余位数取反;



  • 1 的反码为:00000001

  • -1 的反码为: 111111110



补码



在计算机中没有原码,反码的存在,只有补码,补码参与实际运算



「补码」一个数如果为正,则它的原码、反码、补码相同;一个数如果为负,则取它的反码然后加 1 (反码加1就是补码),负数的补码表示做补码运算可以得到其对应正数的原码



  • 1 的补码为:00000001

  • -1 的补码为: 111111111

-1 求补码的步骤:



  1. 先求 -1 的原码是 00000001

  2. 再求 -1 的反码是 11111110

  3. 最后,求 -1 的补码是 11111111



计算机的实际运算



计算机其实只能做加法运算,1 - 1 其实是通过计算 1 + (-1) 的结果而实现的。



 1 用原码计算 1 - 1
 
1 --> 0000 0001
-1 --> 1000 0001
+ --------------
-2 --> 1000 0010
 2 用补码计算 1 - 1
 
1 --> 0000 0001
-1 --> 1111 1111
+ --------------
0 --> 1 0000 0000



对于 byte 类型,正数的最大表示为 0111 1111,即 127,负数的最小表示为 1000 0000,即 -128,表示范围就是 -128 ~ 127

用户头像

michaelliu

关注

Stay hungry, stay foolish. 2017.10.24 加入

120 %

评论

发布
暂无评论
Java 编程基础