Java整数运算

基础运算:四则与取余

Java整数运算遵循数学中的四则运算规则,支持加、减、乘、除和取余操作,运算结果始终是精确的整数。

基本运算符

  • 加法:使用+运算符
  • 减法:使用-运算符
  • 乘法:使用*运算符
  • 除法:使用/运算符,注意整数除法会自动舍弃小数部分
  • 取余:使用%运算符,返回除法的余数

示例代码:

int a = 10;
int b = 3;
System.out.println(a + b); // 13
System.out.println(a - b); // 7
System.out.println(a * b); // 30
System.out.println(a / b); // 3(而非3.333)
System.out.println(a % b); // 1(10除以3的余数)

运算优先级与括号

和数学运算一样,Java整数运算也有明确的优先级,可通过括号()改变运算顺序:

int result = (10 + 20) * 3; // 先算加法,再算乘法,结果为90

溢出:整数运算的"隐形陷阱"

Java中每种整数类型都有固定的表示范围,当运算结果超出该范围时,就会发生溢出。溢出不会导致编译错误或运行时异常,但会产生错误的结果。

溢出示例

int maxInt = Integer.MAX_VALUE; // 2147483647
int overflow = maxInt + 1;
System.out.println(overflow); // -2147483648(溢出后变成最小值)

溢出原因解析

整数在计算机中以二进制补码形式存储,最高位为符号位(0表示正数,1表示负数)。当运算导致最高位发生变化时,就会产生溢出:

  01111111 11111111 11111111 11111111 (2147483647)
+ 00000000 00000000 00000000 00000001 (1)
-----------------------------------------
10000000 00000000 00000000 00000000 (-2147483648,溢出结果)

避免溢出的方法

  • 使用更大范围的整数类型(如用long代替int
  • 运算前进行范围检查
  • 对于关键计算,使用java.math.BigInteger

简化运算:复合赋值与自增自减

Java提供了多种简化运算的语法,使代码更简洁。

复合赋值运算符

复合赋值运算符将运算和赋值结合在一起:

  • +=a += b 等价于 a = a + b
  • -=a -= b 等价于 a = a - b
  • *=a *= b 等价于 a = a * b
  • /=a /= b 等价于 a = a / b
  • %=a %= b 等价于 a = a % b

示例:

int num = 10;
num += 5; // 等价于 num = num + 5,结果为15
num *= 2; // 等价于 num = num * 2,结果为30

自增与自减运算符

++(自增)和--(自减)运算符用于将变量的值加1或减1:

  • 前缀形式:++a 先加1再使用变量值
  • 后缀形式:a++ 先使用变量值再加1

示例:

int x = 5;
int y = ++x; // x先变为6,再赋值给y,y=6
int z = x--; // x先赋值给z(z=6),再变为5

建议:避免在复杂表达式中使用自增/自减运算符,以免降低代码可读性和产生难以预料的结果。

位运算:直接操作二进制

位运算直接对整数的二进制位进行操作,是一种高效的运算方式。

移位运算

  • 左移a << na的二进制位向左移动n位,右边补0
  • 右移a >> na的二进制位向右移动n位,左边补符号位(正数补0,负数补1)
  • 无符号右移a >>> na的二进制位向右移动n位,左边补0

示例:

int a = 8; // 二进制:1000
int b = a << 1; // 16(10000)
int c = a >> 1; // 4(100)
int d = -8 >>> 1; // 2147483644(无符号右移将负数转为正数)

逻辑位运算

  • 与(AND):a & b 对应位都为1则结果为1,否则为0
  • 或(OR):a | b 对应位有一个为1则结果为1
  • 非(NOT):~a 对应位取反(0变1,1变0)
  • 异或(XOR):a ^ b 对应位不同则结果为1,相同则为0

示例:

int x = 0b1010; // 10
int y = 0b1100; // 12
System.out.println(x & y); // 0b1000(8)
System.out.println(x | y); // 0b1110(14)
System.out.println(~x); // -11(二进制取反)
System.out.println(x ^ y); // 0b0110(6)

位运算在底层编程、图形处理、加密算法等领域有广泛应用。例如,使用与运算可以快速判断一个数是否为偶数:if ((num & 1) == 0)

类型转换:自动提升与强制转换

当不同类型的整数参与运算时,会发生类型转换。

自动类型提升

运算时,小范围类型会自动转换为大范围类型:

  • byteshortcharintlong

示例:

short s = 100;
int i = 200;
long result = s + i; // s自动提升为int,再提升为long

强制类型转换

使用(目标类型)可以将大范围类型转换为小范围类型:

long bigNum = 123456;
int smallNum = (int) bigNum; // 强制转换为int

注意:如果大范围类型的值超出了小范围类型的表示范围,强制转换会导致数据错误,应谨慎使用。

运算优先级

Java定义了明确的运算优先级,决定了表达式中运算的执行顺序。从高到低主要包括:

  1. 括号 ()
  2. 自增/自减、非 ++ -- ! ~
  3. 乘、除、取余 * / %
  4. 加、减 + -
  5. 移位运算 << >> >>>
  6. 关系运算 < > <= >= instanceof
  7. 相等判断 == !=
  8. 位与 &
  9. 位异或 ^
  10. 位或 |
  11. 逻辑与 &&
  12. 逻辑或 ||
  13. 三元运算符 ? :
  14. 赋值运算符 = += -=

当不确定优先级时,最简单也最推荐的做法是使用括号明确指定运算顺序。

总结和建议

  1. 留意可能超出类型范围的计算,使用合适的数据类型
  2. 掌握位运算(移位和逻辑位)的规则和使用技巧
  3. 留意不同类型数据参与计算时的自动类型提升规则,掌握强制类型转换

Java程序基础——2.整数运算的更多相关文章

  1. 廖雪峰Java1-2Java程序基础-3整数运算

    1.四则运算规则 int i =(100 + 200) * (99 -88);//3300 int n = i + 9;//3309 //除法结果为整数 int q = n / 100;//33 // ...

  2. 使用.bat来执行Java程序基础

    将java程序做成可运行的jar后,又希望使用.bat文件来调用jar时,有几点需要注意的. 1.设置path和classpath .bat文件中扥的内容如下: @echo off set MY_HO ...

  3. JAVA程序开发按位运算的记录

    忘记在哪里看到一个面试题:把int a,b的值互换,不能使用临时变量.刚开始完全懵逼,脑子里面全是浆糊,不知道如何下手.查看答案后猛地一惊,心想居然还有这种操作,真是叹为观止,真的感觉自己的基础是如此 ...

  4. Java程序基础编程基础

    1.在屏幕上输出"你好" //Programmer name Helloword.javapublic class Helloword { public static void m ...

  5. 廖雪峰Java1-2程序基础-5浮点数运算

    1.浮点数运算的特点 很多浮点数无法精确表示 计算有误差 整型可以自动提升到浮点型 如0.1用二进制表示会是一个无限循环的小数.计算机不可能在有限内存中表示一个无限小数.因此浮点数不能精确表示.也造成 ...

  6. java程序基础

  7. 到头来还是逃不开Java - Java13程序基础

    java程序基础 没有特殊说明,我的所有学习笔记都是从廖老师那里摘抄过来的,侵删 引言 兜兜转转到了大四,学过了C,C++,C#,Java,Python,学一门丢一门,到了最后还是要把Java捡起来. ...

  8. day2Java程序基础

    Java程序基础 Java程序基本结构 一个程序的基本单位是class,class是关键字 类名要求: 类名必须以英文字母开头,后接字母,数字和下划线的组合 习惯以大写字母开头 public除了修饰类 ...

  9. java中多个数字运算后值不对(失真)处理方法

    最近遇到一个bug ,在java里面计算两个数字相减,633011.20-31296.30 得到的结果居然是601714.8999999999,丢失精度了,原来这是Java浮点运算的一个bug. 解决 ...

  10. Java程序员金三银四精心准备的面试题及答案(基础篇)

    1.面向对象的特征有哪些方面? [基础] 答:面向对象的特征主要有以下几个方面: 1)抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问 ...

随机推荐

  1. Stream流中map与flatMap区别|转

      map和flatMap都是对流中的每一个元素,执行入参中的函数式方法,只是在函数式方法的返回值上有区别: map中函数式方法返回值为对象,也就是原始流中有n个元素,处理之后的流中元素个数也是n.即 ...

  2. CSP-S 2020模拟训练题1-信友队T4 二维码

    题意简述 有一个初始全白的\(n*m\)大小的二维网格,每次可以选择一行或一列染全白或全黑.问可以通过任意次该操作得到多少不同的网格.答案对998244353取模. 分析 不难发现,无论怎么染色,都不 ...

  3. Typora优化教程:如何使用回车键来实现「换行」而非「分段」(类似Obsidian)

    Typora优化教程:如何使用回车键来实现「换行」而非「分段」(类似Obsidian) 前言: 首先 在Typora中的默认设置中 按一下 回车键 会实现「分段」操作(中间空一行) 按一下 Shift ...

  4. HyperWorks的RT功能及使用技巧

    在Altair(HyperWorks)里,当结构中包含 T 型.X 型或更复杂的连接特征(图 2-12 所示)时,此功能非常有效.不适用于没有 T 型连接的特征(图 2-12 右侧). 图 2-12 ...

  5. 你知道CAE软件的配置要求吗?

    CAE软件是一类特殊的计算机软件,主要用于工程设计和分析.由于CAE软件的处理量非常大,因此对计算机的配置要求较高.在选择计算机配置时,需要考虑多个因素,包括CPU.GPU.内存和存储等. 首先,CP ...

  6. 自定义Excel右下角状态栏的显示项

    Excel右下角的状态栏是一个非常方便和有用的显示栏,在执行一些简单的计算时可以直接选取需要计算的区域即可得到汇总,计数,平均值等结果. 如果需要调整状态栏的显示选项,则在状态栏处右键点击: 可以选中 ...

  7. Rust 修仙之道 第十章 链灵境 · 构筑灵链之道

    第十章:链灵境 · 构筑灵链之道 "灵链相接如脉络,错一节则断万法:唯指向明晰.层次分明者,方可汇聚长流." 顾行云接下了云隐派的一道秘术任务:重塑断裂的灵气传输通道.此通道呈现& ...

  8. 本地代理之Charles使用

    简介Charles是一款网络监测工具,还能将线上的资源代理(偷梁换柱)成本地的资源,再有时候不方便发版或修改源代码的时候,这一招倒是挺方便的 下载与安装官网地址:www.charlesproxy.co ...

  9. LInux main.cpp 编码问题 导致影响后面的内容

    euc-cn linux 的vim 可以查看和设置编码 :set fileencoding euc-cn 表示的是 gbk编码 1.在Vim中直接进行转换文件编码,比如将一个文件转换成utf-8格式 ...

  10. Ant Design如何自定义输入框(Input)组件样式

    介绍 今天接到一个需求,需要自定义一个Input输入框,我们的项目使用React + Ant Design进行开发,按理说Ant Design已经提供了非常丰富的组件样式,但有时候还是无法满足特定的需 ...