Java 每日一刊(第6期):整数运算

文章目录

    • 前言
    • Java 的整数类型
    • 基本的整数运算符
    • 整数除法与取模
    • 自增与自减运算
    • 整数的进制表示
    • 整数溢出问题
    • 位运算
    • 整数的优化技巧
    • 类型自动提升(Type Promotion)
    • 强制类型转换(Type Casting)
    • 本期小知识

在有限的符号中,我们揭示无限的真理。

前言

这里是分享 Java 相关内容的专刊,每日一更。

本期将为大家带来以下内容:

  1. Java 的整数类型
  2. 基本的整数运算符
  3. 整数除法与取模
  4. 自增与自减运算
  5. 整数的进制表示
  6. 整数溢出问题
  7. 位运算
  8. 整数的优化技巧
  9. 类型自动提升(Type Promotion)
  10. 强制类型转换(Type Casting)

Java 的整数类型

Java 是一种强类型语言,变量在声明时必须指定类型。对于整数运算,Java 提供了以下几种基本数据类型:

类型大小最小值最大值
byte1 字节-128127
short2 字节-32,76832,767
int4 字节 − 2 31 -2^{31} 231 2 31 − 1 2^{31} - 1 2311
long8 字节 − 2 63 -2^{63} 263 2 63 − 1 2^{63} - 1 2631

这些类型主要区别在于存储的整数范围。最常用的整数类型是 int,它足够处理大多数普通整数运算。如果需要处理更大范围的整数,long 是合适的选择。

基本的整数运算符

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
System.out.println("取模: " + (a % b));  // 输出: 1

整数除法与取模

整数除法运算会舍去小数部分,返回一个整数结果。例如,10 / 3 的结果是 3 而不是 3.333。如果需要得到除法运算后的余数,可以使用取模运算符 %

int result = 10 / 3;    // 结果是 3
int remainder = 10 % 3; // 余数是 1

这种整数除法与取模的组合常常用于循环控制、数据分段等场景。

自增与自减运算

Java 提供了自增(++)与自减(--)运算符,用于对整数进行快速的加 1 或减 1 操作。这些运算符有两种形式:前置 和 后置 ,它们的执行顺序有所不同。

  • 前置运算符(++x--x):先对变量进行加 1 或减 1 操作,然后再返回修改后的值。
  • 后置运算符(x++x--):先返回当前变量的值,然后再进行加 1 或减 1 操作。
int x = 5;
int y = ++x;  // 先将 x 加 1(x 变为 6),然后将结果赋值给 y,所以 y 的值为 6
int z = x--;  // 先将 x 的当前值(6)赋给 z,然后再将 x 减 1(x 变为 5)

整数的进制表示

Java 支持多种进制表示方法:

  • 十进制:常规的数字表示,例如 100
  • 二进制:用 0b 开头表示,例如 0b1101 表示十进制的 13
  • 八进制:用 0 开头表示,例如 012 表示十进制的 10
  • 十六进制:用 0x 开头表示,例如 0x1F 表示十进制的 31
int decimal = 100;   // 十进制
int binary = 0b1101; // 二进制
int octal = 012;     // 八进制
int hex = 0x1F;      // 十六进制

整数溢出问题

由于整数类型的有限存储空间,超出范围的运算可能会导致 溢出。Java 不会在整数溢出时抛出异常,而是默默地将值“环绕”到最小值。例如,int 的最大值是 2147483647,如果加 1,结果会变成 -2147483648

int maxValue = Integer.MAX_VALUE;
System.out.println(maxValue + 1);  // 输出: -2147483648

为了解决溢出问题,Java 提供了 java.lang.Math 类中的一些方法,如 Math.addExact(),它在检测到溢出时会抛出 ArithmeticException 异常。

int result = Math.addExact(Integer.MAX_VALUE, 1);

位运算

Java 提供了位运算符,允许直接操作整数的二进制位。这些运算包括按位与、按位或、按位异或、位移操作等。

  • & :按位与
  • | :按位或
  • ^ :按位异或
  • ~ :按位取反
  • << :左移
  • >> :右移
  • >>> :无符号右移
int a = 5;   // 二进制 0101
int b = 3;   // 二进制 0011
System.out.println(a & b);  // 结果 1(二进制 0001)
System.out.println(a | b);  // 结果 7(二进制 0111)
System.out.println(a ^ b);  // 结果 6(二进制 0110)
System.out.println(~a);     // 结果 -6

位运算常用于性能敏感的场景,比如加密算法、位掩码操作等。

整数的优化技巧

  • 使用合适的类型:对于小范围的整数运算,尽量使用 byteshort 以节省内存。
  • 溢出检测:在关键的整数运算场景下,使用 Math.addExact() 等方法来检测溢出。
  • 位运算替代普通运算:在某些高性能场景中,位运算可以比普通算术运算更高效。例如,左移 << 相当于乘以 2,右移 >> 相当于除以 2。

类型自动提升(Type Promotion)

类型自动提升是指在表达式中,当参与运算的不同数据类型不一致时,Java 自动将较小的类型提升为较大的类型,以避免数据丢失。通常,这种提升遵循从低精度到高精度的顺序:

byte → short → int → long → float → double

int a = 10;
long b = 20L;
long result = a + b;  // a 自动提升为 long 类型
System.out.println(result);  // 输出 30

在上面的示例中,int 类型的变量 a 在与 long 类型的 b 进行加法运算时,a 会自动提升为 long 类型。Java 将较小的类型(int)提升为较大的类型(long),以确保运算结果的准确性。

强制类型转换(Type Casting)

强制类型转换是将一个数据类型的值显式转换为另一个类型的过程。这通常用于将高精度的类型转换为低精度类型(比如将 double 转换为 int),或者在需要进行特定的类型转换时使用。强制转换可能会导致数据丢失,因此需要格外小心。

long largeValue = 100L;
int smallerValue = (int) largeValue;  // 强制转换为 int
System.out.println(smallerValue);     // 输出 100

在上述示例中,long 类型的 largeValue 被强制转换为 int,因为 long 的范围大于 int,因此这种转换必须显式进行。强制转换需要用括号显式指定目标类型,以表明开发者已经意识到可能的风险。

本期小知识

位移运算是一种高效的数学运算,在 Java 中可以用来替代乘除法。比如,左移运算符 << 相当于乘以 2,右移运算符 >> 相当于除以 2。

int a = 4;
System.out.println(a << 1);  // 输出: 8,相当于 4 * 2
System.out.println(a >> 1);  // 输出: 2,相当于 4 / 2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/423345.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web基础之信息泄露

1、目录遍历漏洞 &#xff08;1&#xff09;原理&#xff1a;本质是没有过滤用户输入的 ../ 相关的目录跳转符&#xff0c;使得攻击者通过目录跳转符来遍历服务器中的任意文件。 &#xff08;2&#xff09;题解&#xff1a; eg:根据提示遍历网页目录信息&#xff0c;会在某一个…

文生视频算法

文生视频 Sora解决问题&#xff1a;解决思路&#xff1a; CogVideoX解决问题&#xff1a;解决思路&#xff1a; Stable Video Diffusion&#xff08;SVD&#xff09;解决问题&#xff1a;解决思路&#xff1a; 主流AI视频技术框架&#xff1a; Sora Sora: A Review on Backg…

Vue3 响应式工具函数isRef()、unref()、isReactive()、isReadonly()、isProxy()

isRef() isRef()&#xff1a;检查某个值是否为 ref。 isRef函数接收一个参数&#xff0c;即要判断的值。如果该参数是由ref创建的响应式对象&#xff0c;则返回true&#xff1b;否则&#xff0c;返回false。 import { ref, isRef } from vue const normalValue 这是一个普通…

Ajax 揭秘:异步 Web 交互的艺术

Ajax 揭秘&#xff1a;异步 Web 交互的艺术 一 . Ajax 的概述1.1 什么是 Ajax ?1.2 同步和异步的区别1.3 Ajax 的应用场景1.3.1 注册表单的用户名异步校验1.3.2 内容自动补全 二 . Ajax 的交互模型和传统交互模型的区别三 . Ajax 异步请求 axios3.1 axios 介绍3.1.1 使用步骤3…

STM32——看门狗通俗解析

笔者在学习看门狗的视频后&#xff0c;对看门狗仍然是一知半解&#xff0c;后面在实际应用中发现它是一个很好用的检测或者调试工具。所以总结一下笔者作为初学小白对看门狗的理解。 主函数初始化阶段、循环阶段和复位 众所周知&#xff0c;程序的运行一般是这样的&#xff1…

【面试八股总结】Redis持久化

Redis 实现了数据持久化的机制&#xff0c;这个机制会把数据存储到磁盘&#xff0c;这样在 Redis 重启就能够从磁盘中恢复原有的数据。 Redis 共有三种数据持久化的⽅式&#xff1a; AOF 日志&#xff1a;每执行一条写操作命令&#xff0c;就把该命令以追加的方式写入到⼀个文…

【计算机网络】HTTP相关问题与解答

此篇文章内容会不定期更新&#xff0c;仅作为学习过程中的笔记记录 目录 一、HTTP请求和响应报文是怎样的&#xff1f; 1、请求报文 2、响应报文 二、HTTP请求方法有哪些&#xff1f; GET HEAD POST PUT DELETE PATCH OPTIONS TRACE CONNECT 三、GET请求与POST请…

菜单、工具栏 的基本使用

效果 代码 #include "mainwindow.h" #include "ui_mainwindow.h" #include<QToolBar> #include<QDebug> #include<QPushButton>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupU…

将一个字符串以三个字符为间隔分别放在三个字符串数组里

要求 请编写函数fun&#xff0c;其功能是:编写函数char *fun(char*s0,char *s1,char *s2,char*s3)&#xff0c; 要求实现: 将s0所指字符串分解成三个字符串&#xff0c;分别存入s1、s2、s3所指内存中。分解的方法是&#xff0c;s1、s2、53从s0中依次顺序每隔3个字符取1例如:s0…

OpenCV 4.10 windows 上编译并上传conan

目录 一. 上传opencv 预编译包 二. 自己手动写一个测试包并上传 三. 自己写一个app, 引用包 一. 上传opencv 预编译包 1. 下载Opencv, 并用cmake 打开 打开工程之后&#xff0c;编译&#xff0c;install&#xff0c; 目录如下 2. 准备conan 包 把Debug 和 Release 分开放 3…

CleanClip for Mac 剪切板 粘贴工具 历史记录 安装(保姆级教程,新手小白轻松上手)

CleanClip&#xff1a;革新macOS剪贴板管理体验 目录 功能概览 多格式历史记录保存智能搜索功能快速复制操作拖拽功能 安装指南 前期准备安装步骤 配置与使用 功能概览 多格式历史记录保存 CleanClip支持保存文本、图片、文件等多种格式的复制历史记录&#xff0c;为用户提…

【应用笔记】Cot Menu 轻量级多级菜单控制框架程序(C语言)

【应用笔记】Cot Menu 轻量级多级菜单控制框架程序&#xff08;C语言&#xff09; 前言: 工作需要, 实现一个串口打印的类shell菜单. 如果按照以往的习惯我会自己重新"构思"(狗屎)一个菜单框架.之前用oled和lcd时,我都从零重复造轮子. 作为一个成熟的程序员, 应该要学…

【机器学习(二)】分类和回归任务-决策树算法-Sentosa_DSML社区版

文章目录 一、算法概念二、算法原理&#xff08;一&#xff09;树的构造&#xff08;二&#xff09;划分选择1、信息增益2、基尼指数3、卡方检验 &#xff08;三&#xff09;停止标准&#xff08;四&#xff09;剪枝处理1、预剪枝2、后剪枝 三、决策树的优缺点四、决策树分类任…

ai扩图使用什么软件?无损扩图用这5个

你们知道ai扩图是什么吗&#xff1f;其实就是利用人工智能技术对图片进行无损放大处理&#xff0c;让低分辨率的图片变得清晰。通常在图像处理、设计和摄影领域尤为实用。 那么&#xff0c;你们知道ai扩图在线工具怎么选吗&#xff1f;别急&#xff0c;下面这篇文章分享5个超好…

11Python的Pandas:可视化

Pandas本身并没有直接的可视化功能&#xff0c;但它与其他Python库&#xff08;如Matplotlib和Seaborn&#xff09;无缝集成&#xff0c;允许你快速创建各种图表和可视化。这里是一些使用Pandas数据进行可视化的常见方法&#xff1a; 1. 使用Matplotlib Pandas中的plot()方法…

品读 Java 经典巨著《Effective Java》90条编程法则,第4条:通过私有构造器强化不可实例化的能力

文章目录 【前言】欢迎订阅【品读《Effective Java》】系列专栏java.lang.Math 类的设计经验总结 【前言】欢迎订阅【品读《Effective Java》】系列专栏 《Effective Java》是 Java 开发领域的经典著作&#xff0c;作者 Joshua Bloch 以丰富的经验和深入的知识&#xff0c;全面…

【软件文档】软件系统应急处理方案(word原件)

1 总则   1.1 目的 1.2 工作原则   2 应急工作小组机构及职责 3 预警和预防机制 3.1 系统监测及报告   3.2 预警 3.3 预警支持系统 3.4 预防机制 4 应急处理程序 4.1 系统突发事件分类分级的说明 4.2 系统应急预案启动 4.3 现场应急处理 5 保障措施   5.1 应急演练 5.2…

时间复杂度计算 递归

我们先拿出 2021 csp-s 程序题中一道看着就头大的程序题&#xff0c;要求分析 solve1 的复杂度。 设 T(n) ⁡ \operatorname{T(n)} T(n) 表示数组长度为 n n n 时的复杂度&#xff08;即 m − h 1 n m-h1n m−h1n&#xff09;。 T ( 1 ) 1 T(1)1 T(1)1&#xff0c;根据…

R语言机器学习算法实战系列(一):XGBoost算法(eXtreme Gradient Boosting)

介绍 XGBoost(eXtreme Gradient Boosting)是一种基于梯度提升决策树(GBDT)的优化算法,它在处理大规模数据集和复杂模型时表现出色,同时在防止过拟合和提高泛化能力方面也有很好的表现。以下是XGBoost算法的原理和应用方向的详细介绍: 算法原理 目标函数:XGBoost的目标…

华为ensp中vlan与静态路由技术的实现

vlan 同一网段的设备&#xff0c;可以互通&#xff1b; 虚拟局域网&#xff1a;将局域网从逻辑上划分为多个局域网&#xff0c;不同通过vlan编号区分&#xff1b; 实现网络隔离。提高了网络安全性&#xff1b; vlan编号为12位&#xff1b; 范围1-4094可以用来配置 默认处于…