`
juiccee
  • 浏览: 9350 次
  • 性别: Icon_minigender_1
  • 来自: 昆明
最近访客 更多访客>>
社区版块
存档分类
最新评论

Thinking in Java 笔记:Operators

阅读更多
数学没学好,补充点数学知识
e:欧拉数,自然对数函数的底数.
(1+1/n)的n次方,n趋于无穷大,所得到的数就是e.
e不论对x微分几次,结果都还是e.导致一些无聊的数学系学生用e比喻坚定不移的爱情.

ln以e为底数,lg以10为底数.

在Java中,e以Math.E存在
由于FORTRAN最初是一个UPPERCASE Language,在FORTRAN中E作为Exponential的简写代表以10为基数的幂来用,而不会和e混淆,然后C,C++,Java也都这么干了,所以:
    像 1.39e-43f 这样的东西表示 1.39*10^-43 而不是 1.39*e^-43

编译器默认将指数作为双精度数(double)处理,所以
    float f4 = 1.39e-43 包含了一个窄化转换的操作,编译报错
    float f4 = 1.39e-43f 指出右边是一个float常量,编译通过

截断与舍入:当从float或double向int转型时,小数点后边的数值被截断并直接丢弃而不会进行四舍五入的操作,若需要四舍五入的操作,可用Marh.round()方法.

提升(Promotion):通常,表达式中出现的最大数据类型决定了表达式最终结果的数据类型.比int小的数据类型(short,byte,char)执行算术运算或按位运算前会自动转换成int类型,最终生成的结果也是int类型,如果要把结果赋给较小的数据类型,就需要使用强制类型转换,并可能出现信息丢失.

逻辑运算符 VS 按位运算符
1.逻辑运算符只能操作布尔值或者一个能产生布尔值的表达式;按位运算符能操作整型值,包括byte、short、int、long,但是不能操作浮点型值(即float和double),它还可以操作字符型(char)值。
2.逻辑运算符的运算遵循短路形式,而按位运算符则不是。

移位运算符
移位运算符和按位运算符一样,同属于位运算符,因此移位运算符的位指的也是二进制位。它包括以下几种:

  1. 左移位(<<):将操作符左侧的操作数向左移动操作符右侧指定的位数。移动的规则是在二进制的低位补0。
  2. 有符号右移位(>>):将操作符左侧的操作数向右移动操作符右侧指定的位数。移动的规则是,如果被操作数的符号为正,则在二进制的高位补0;如果被操作数的符号为负,则在二进制的高位补1。
  3. 无符号右移位(>>>):将操作符左侧的操作数向右移动操作符右侧指定的位数。移动的规则是,无论被操作数的符号是正是负,都在二进制位的高位补0。
  4. byte、short、char在做移位运算之前,会被自动转换为int类型,然后再进行运算。
  5. byte、short、int、char类型的数据经过移位运算后结果都为int型。
  6. long经过移位运算后结果为long型。
  7. 在移位运算时,如果要操作数大于被操作数对应数据类型所能表示的最大位数,那么先将操作数对该类型所能表示的最大位数(short,,char,byte为32,long为64)求余后,再将被被操作数移位所得余数对应的数值。比如1<<35=1<<(35%32)=1<<3=8。


补充:java中数值编码为补码形式.
正数的原码,补码相同;
负数的补码:符号位不变,其余位根据其绝对值的原码逐位取反,并在最低一位加一求得.

移位可与等号(<<=,>>=,>>>=)组合使用.
如果对byte或short进行无符号右移结合赋值操作时,它们会先被转成int,然后被截断并赋予原来的值,可能产生不正确的结果.

移位操作会改变符号位的值,移出存储范围的值被丢弃而不是回放回队尾(C中好象有这种移位方法)
如下代码所示
 public abstract class Test2 {   
    public static void main(String[] args) { 
    	System.out.println("-7的补码"+Integer.toBinaryString(-7));
    	System.out.println("-7>>2 = "+Integer.toBinaryString(-7>>2));
    	System.out.println("-7>>>2 = "+Integer.toBinaryString(-7>>>2));
    	System.out.println("7<<28= " + (7<<28) +" BinaryString = " +Integer.toBinaryString(7<<28));
    	System.out.println("7<<29= " + (7<<29) + "BinaryString =" + Integer.toBinaryString(7<<29));
    	System.out.println("7<<30= " + (7<<30) +"BinaryString ="+ Integer.toBinaryString(7<<30));
    	System.out.println("1 << 31 = " + (1 << 31));
        System.out.println("-1 << 31 = " + (-1 << 31));  
        int h = 65536*65536/2;
        int j = 65536/2*65536;
        int k = -65536/2*65536;
        System.out.println("65536*65536/2=" + Integer.toBinaryString(h));
        System.out.println("65536/2*65536="+ Integer.toBinaryString(j));
        System.out.println("-65536/2*65536=" + Integer.toBinaryString(k));

    }   
} //output:
//-7的补码11111111111111111111111111111001
//-7>>2 = 11111111111111111111111111111110 有符号右移位
//-7>>>2 =  111111111111111111111111111110 无符号右移位,
// 实际上是00111111111111111111111111111110
//7<<28= 1879048192 BinaryString = 1110000000000000000000000000000 
// 实际上是01110000000000000000000000000000
//7<<29= -536870912BinaryString =11100000000000000000000000000000 符号位被改写
//7<<30= -1073741824BinaryString =11000000000000000000000000000000
//1 << 31 = -2147483648 最小int值-2^31 最高位的1被丢弃
//-1 << 31 = -2147483648
//65536*65536/2=0 溢出
//65536/2*65536=10000000000000000000000000000000 -2^31的补码表示
//-65536/2*65536=10000000000000000000000000000000



参考文章: 臧圩人:JAVA面试题解惑系列 (11)

分享到:
评论

相关推荐

    Thinking in C: Foundations for Java &amp; C++

    Thinking in C: Foundations for Java & C++ by Chuck Allison produced by Bruce Eckel Chapter 1: Introduction and Getting Started40 MinutesStart Lecture Chapter 2: Fundamental Data Types41 ...

    Thinking in Java 4th Edition + Annotated Solution Guide (代码)英文文字版 带书签 有答案

    《Thinking in Java》是Bruce Eckel的经典之作,第四版涵盖了Java编程语言的广泛主题,适合初学者和有经验的程序员。这本书深入浅出地讲解了Java的核心概念和技术,旨在帮助读者建立坚实的编程基础,并理解面向对象...

    Thinking in Java 4th Edition with Annotated Solution Guide编程思想+课后习题源码

    《Thinking in Java 4th Edition with Annotated Solution Guide》是一本经典的Java编程教材,由Bruce Eckel撰写。这本书深入浅出地介绍了Java编程的核心概念和技术,对于初学者和经验丰富的开发者来说,都是一个...

    thinking in Java guide solutio

    根据提供的文件信息,我们可以将《Thinking in Java》第四版中的主要内容和知识点进行详细的解析与总结。本书由Bruce Eckel编写,是学习Java编程语言的经典教材之一。以下是对书中的几个关键章节及其涵盖的重要知识...

    Thinking In Java学习之50问

    - **移位操作符(shift operators)**:如、&gt;&gt;、&gt;&gt;&gt;等,用于将二进制表示的数值进行左移或右移操作。 ### 15. 构造函数 - **构造函数**:用于初始化对象,每个类至少有一个构造函数。 ### 16. 默认构造函数 - 如果...

    Java.Crash.Course.1541019245.epub

    You will understand how to set a simple operator in Java You will learn all the technical Java programming language such as Loops and Arrays, Boolean Logic, Methods, Inheritance and Polymorphism, ...

    Operators and expressions in Java_java_expression_

    在Java编程语言中,运算符和表达式是构建程序的基础元素。它们用于执行计算、比较、逻辑操作等任务。下面我们将详细探讨Java中的各种运算符和表达式。 1. **算术运算符**:Java提供了基本的算术运算符,如`+`(加法...

    Thinking in LINQ

    • Chapter 1: Thinking Functionally Our generation of programmers has been raised with object-oriented programming ideas. This initial chapter is dedicated to showing how functional programming is ...

    1Z0-811 Exam Guide to Have a Cakewalk in Oracle Java SE Certific

    - **Arithmetic Operators:** Understand how to perform basic arithmetic operations in Java. - **Logical Operators:** Learn about logical operators and their use in conditional statements. - **...

    学习笔记java _day02

    在Java学习的第二天,我们深入理解了JRE的构成,它是Java运行环境,包含了JVM(Java虚拟机)和其他必要的类库文件。这些类库文件,如`tools.jar`,对于Java程序的运行至关重要。Java中,我们常用`jar`命令来打包和...

    Java.SE.7.Programming.Essentials

    Using Java Operators and Conditional Logic Chapter 4. Using Java Arrays Chapter 5. Using Loops in Java Code Chapter 6. Encapsulating Data and Exposing Methods in Java Chapter 7. Using Java ...

    Java2核心技术卷I+卷2:基础知识(第8版) 代码

    Chapter 3: Fundamental Programming Structures in Java 35 A Simple Java Program 36 Comments 39 Data Types 40 Variables 44 Operators 46 Strings 53 Input and Output 63 Control Flow 71 Big ...

    java-leetcode题解之Expression Add Operators.java

    java java_leetcode题解之Expression Add Operators.java

    java-leetcode题解之Least Operators to Express Number.java

    java java_leetcode题解之Least Operators to Express Number.java

Global site tag (gtag.js) - Google Analytics