zoukankan      html  css  js  c++  java
  • java入门篇3 --- 基本数据类型的运算

    一、整数

    1.运算

    java的整数运算遵从基本的四则运算,不再赘述

    下面说一下整数的除法得到的结果永远是精确的,也就是除不尽就给你取整,我记得python2的int类型会保留小数,python3之后也只保留整数

    另外取余也是使用%,除法如果除数是0,运行时会报错。

    注意,整数有范围,如果超出最大的会溢出,感觉像是又重新走了一个循环。请根据需要使用整型的类型,如果数值大于int范围,可以使用long

    另外java也支持n++, n+=1语法糖

    public class HelloWorld {
        public static void main(String[] args) {
            int x = 5 / 3;
            int y = 5 % 3;
            int z = 0 % 5;
            //  int m = 5 / 0;  // Exception in thread "main" java.lang.ArithmeticException: / by zero
            int n = 2147483647;
            System.out.println(n);  // 2147483647
            n += 1;
            System.out.println(n);  // -2147483648
            n += 10;
            System.out.println(x);  // 1
            System.out.println(y);  // 2
            System.out.println(z);  // 0
            System.out.println(n);  // -2147483639
        }
    }

    2.移位运算

    一般使用>>与<<,淡然也有使用>>>,三个符号的是不带符号的右移运算,符号为会跟着一起动

    public class HelloWorld {
        public static void main(String[] args) {
            int x = 32;
            int y = 1;
            int m1 = x >> 1;
            int m2 = x >> 2;
            int m3 = x >> 3;
            int m4 = x / 2;
            int m5 = x / 4;
            int m6 = x / 8;
            int n1 = y << 1;
            int n2 = y << 2;
            int n3 = y << 3;
            int n4 = y * 2;
            int n5 = y * 4;
            int n6 = y * 8;
            System.out.println(m1 + " " + m4);  // 16 16
            System.out.println(m2 + " " + m5);  // 8 8
            System.out.println(m3 + " " + m6);  // 4 4
            System.out.println(n1 + " " + n4);  // 2 2
            System.out.println(n2 + " " + n5);  // 4 4
            System.out.println(n3 + " " + n6);  // 8 8
            int h = 32;
            int h1 = h >>> 2;
            int g = -32;
            int g1 = g >>> 2;
            System.out.println(h1);  // 8
            System.out.println(g1);  // 1073741816
        }
    }

    从上述例子可以看出,位移结构跟乘除2是一样的,因为位移就是直接在二进制编码上对数字进行左移或者右移的操作,因此位移操作会更快一些。三个>>>的运算直接把符号都移动了,因此在计算负数时,需考虑在内。

    3.位运算

    位元算就是与、或、非、异或的操作

    public class HelloWorld {
    public static void main(String[] args) {
    int x = 0 & 111;
    int x2 = 32 & 64;
    int y = 0 | 111;
    int z1 = ~111;
    int z2 = ~100;
    int z3 = ~-100;
    int k = 0 ^ 111;
    System.out.println(x); // 0
    System.out.println(x2); // 0
    System.out.println(y); // 111
    System.out.println(z1); // -112
    System.out.println(z2); // -101
    System.out.println(z3); // 99
    System.out.println(k); // 111
    }
    }

    从上述例子中可以看出,两个整数进行与的草哦做,其实应该是将位对齐,就是拆解成二进制的,然后进行与的操作,这里只写最后一个字节的

    32:... 00001000

    64:... 00010000

    进行位运算,0&1得0所以最终结果是0

    非~操作,经自行测试,这个就是取反并减一

    二、浮点数

    浮点数只有四则运算,没有其他的位运算之类的东东

    另外浮点数因为精度无法控制,因此计算的结构有时会有一点点误差,如下所示,因此在比较计算结构时,可以测量计算结果的绝对值是否小于一个很小的数

    public class HelloWorld {
    public static void main(String[] args) {
    double x = 1.0 / 10;
    double y = 1 - 9.0 / 10;
    double z = 1.0 / 0;
    float x1 = 1.0f / 10;
    float y1 = 1f - 9.0f / 10;
    float z1 = 1.0f / 0;
    System.out.println(x); // 0.1
    System.out.println(y); // 0.09999999999999998
    System.out.println(x1); // 0.1
    System.out.println(y1); // 0.100000024
    System.out.println(z); // Infinity
    System.out.println(z1); // Infinity
    }
    }

    类型提升,从上述中可以看出,如果两个计算的数有一个是政令,那么它会自动提升到浮点型,例如:9.0/10结果是0.1左右,但9/10就是0

    浮点数在除以0时不会报错,而是打印Infinity,表示无穷大

    当然对于类型间的强转如下

    public class HelloWorld {
        public static void main(String[] args) {
            double x = 123.12345678;
            double m = 1.2e10;
            float y = 1234.1234f;
            int z = 123456;
            int x1 = (int) x;
            int y1 = (int) y;
            int m1 = (int) m;
            float z1 = (float) z;
            double z2 = (double) z;
            System.out.println(x1);  // 123
            System.out.println(y1);  // 1234
            System.out.println(m1);  // 2147483647
            System.out.println(z1);  // 123456.0
            System.out.println(z2);  // 123456.0
        }
    }

    在这里面可以发现,浮点数在转化为整型是,小数位数会被抛弃,不遵从四舍五入,因此以后再将浮点数转化为整型时,记得加上0.5

    另外,转化为整型时,如果溢出,则会去整型的最大值

    三、布尔运算

    布尔运算基本都一样,上一篇将boolean时,已经列举过boolean值的获取

    boolean的短路运算就是如果是&的计算,第一个条件为false时,则结果直接为false,这个其他语法一致;

    另外一个就是三元运算符,这个go就不支持,python支持,js也支持,这个语法糖很好用,go不支持,在写的时候,就感觉少了点东西

    下述就是判断条件?结果一:结果二,如果判断条件为真,则返回结果一,否则返回结果二。

    public class HelloWorld {
        public static void main(String[] args) {
            int x = 3 > 5 ? 3 : 5;
            System.out.println(x);  // 5
        }
    }
  • 相关阅读:
    log4j2配置ThresholdFilter,让info文件记录error日志
    Thrift常见异常及原因分析(<i>UPDATING...</i>)
    fastjson序列化出现StackOverflowError
    mysql执行update语句受影响行数是0
    远程Gitlab新建的分支在IDEA里不显示
    rabbitmq延迟队列demo
    利用延迟消息队列取代定时任务
    利用spring实现服务启动就自动执行某些操作的2种方式
    从Joda-Time反观Java语言利弊
    Linux Shell test判断
  • 原文地址:https://www.cnblogs.com/yangshixiong/p/12157373.html
Copyright © 2011-2022 走看看