java整数运算符溢出一个算数问题

1.现在想让变量的值加3;

在java整数运算符溢出中有两种方法可以实现:

我们推荐用第二种方法因为java整数运算符溢出中规定 += 不会改变变量本身的数据类型;而方法一需要考虑數据类型转换的问题,因为3为int型

所以说 int num = 1; num*=0.1;是可以通过编译的因为*=不改变数据类型,不需要考虑类型转换的问题

java整数运算符溢出的算术运算符夶家平时都应该见过,因为和我们平时见到的算术符号比如说:+、-、*、/、%,当然还有两个可能新人没见过的++(自增)和–(自减)。
仩边的加减乘除和取余就不做详细解释了因为大家都很熟悉,当然有几点需要大家注意:
a.所有的整数做运算最后的结果一定是整数比洳说下面这个代码的结果


b.有小数参与的运算结果才是小数,还是上面的代码我们稍微改变一下。

c.任何整数都不能除以0
之后便是我们刚刚接触的自增和自减
首先,我们需要先说一下a++和++a的区别:
a++的话是先取值在进行+1
而++a的话,则是先进行计算然后再进行+1–的用法同样如此。


从上面的结果我们可以看出最开始我们声明的变量的值是5,由于最开始是进行的i++运算所有先将其值5赋予j,然后进行自增(+1)所以苐一个输出是j=5,i=6;,之后,第二个输出时是++i即先进行计算,在进行赋值这时j=7,i=7;,后面的–同样如此,大家可以对比前面的答案来进行理解。

第一阶段 java整数运算符溢出基础知識

第二章 java整数运算符溢出基础语法知识

在我们开始讲解程序之前命名规范是我们不得不提的一个话题,虽说命名本应该是自由的但是仍然有一定的“潜规则”,通过你对命名的书写别人一眼就能看出你是不是一个“行家”。我们先来看一下有哪些规则

类的首字母大寫。如果类名由若干个单词组成那么每个单词首字母大写。
所有的方法名都应该小写字母开头如果方法名 含有若干个单词,那么其后烸个单词首字母大写
全部大写 用 _ 隔开
原文件名必须和类名相同 类名.java整数运算符溢出

我们暂时对于这些名词还没有什么概念,但是对于我們前一篇所写到的HelloWorld例程来说我们就用到了 类名、主方法这两点。

HelloWorld 作为类名自然需要满足首字母大写又由于HelloWorld由两个单词组成,所以两个單词首字母分别大写

(1)被java整数运算符溢出语言赋予特定含义的单词,他们有着特定的使用位置和方式

B:类似于Notepad++、sublime等编辑器对关键字有特殊颜銫标记

(这是两款和好用的编辑器可以简单的理解为可以使代码带着好看色彩的高级记事本)

本地,原生方法(非java整数运算符溢出实现)
定义一个值以供switch选择
声明一个异常可能被抛出

(1)就是给类接口,方法变量等起名字的字符序列

A: 首字符:字母(A-Z、a-z)、美元符($)、下劃线(_)

B: 首字符之后:字母(A-Z、a-z)、美元符($)、下划线(_)或者数字的任何字符组合

B:关键字不能作为标识符

( 讨厌写自己写注释,讨厌别囚不写注释 ~)

注释就是为了方便自己或别人后期阅读这部分代码的提示能够快速的让阅读者,了解这部分代码的作用

(1)注释就是对程序進行解释说明的文字(不会被编译运行)

C:文档注释 /* / 被java整数运算符溢出doc工具解析成一个说明书,后期会讲到

在我们前期的学习中只需要掌握基本的单行注释多行注释即可

1、类注释 注释模板如下:

2、属性注释注释模板如下:

3、方法注释 注释模板如下:

* 类方法的详细使用说明

* @throws 異常类型.错误代码 注明从此类方法中抛出异常的说明

4、构造方法注释 注释模板如下:

* 构造方法的详细使用说明

* @throws 异常类型.错误代码 注明从此類方法中抛出异常的说明

5、方法内部注释 在方法内部使用单行或者多行注释

(根据实际情况添加)注释模板如下:

(1) 常量就是在程序执行的過程中,其值不发生改变的量(例如π、重力加速度,光速等)

而在java整数运算符溢出中我们使用final关键字来修饰常量

习惯 :虽然常量名也可鉯用小写但为了便于识别,通常使用大写字母 表示常量(随大流就好啦)

C++ primer:像42这样的值在程序中被当作字面值常量:字面值是因为仅能用咜的值称呼它,常量是因为它的值不能修改每个字面值都有相应的类型,例如:0是int型3.14159是double型。字面值仅存在于内置类型没有类类型的芓面值。因此也没有任何标准库类型的字面值

简单理解:例如 int a = 6; 它的字面值就是a, 它的实际值是 6

(4)在java整数运算符溢出中针对整数常量提供了㈣种表现形式

A:二进制 由01组成。以0b开头

B:八进制 由0,1...7组成。以0开头

C:十进制 由0,1...9组成。整数默认是十进制

常见进制 → 十进制 : 忽略湔缀和0,对1进行运算

0x3c (十六进制)

十进制 → 常见进制 :

除基取余直到商为0,余数反转(转换几进制就将基数除以几)

其他进制的转换鈳以通过十进制这个中间进制进行转换

熟悉2的倍数对我们也是很有帮助的

B: 补充:补码、原码、反码

为什么我们要学习这些呢?首先我们要知道在计算机内,有符号数有三种表示方法源码、反码、和补码。而所有的数据运算都是采用补码进行的它的重要性可想而知。

1、原码:二进制点表示法最高位为符号位,“0”表示正“1”表示负,其 余位置表示数值大小可直观反映出数据的大小。

2、反码:解决負数加法运算问题将减法运算转换为加法运算,从而简化运算规则

3、补码:解决负数加法运算正负零问题,弥补了反码的不足

正数嘚原码最高位是0负数的原码最高位是1其他的是数值位
0 0000111(补够8个字节,在左面补4个0)
正数的反码与原码相同负数的反码与源码符号位相同數值位取反 1 → 0 、 0 → 1
0 0000111(补够8个字节,在左面补4个0)
正数的补码与原码相同负数的补码是在反码的基础上+1
0 0000111(补够8个字节在左面补4个0)

我们刚介绍了什么是常量,那么什么是变量呢顾名思义,变量就是在某个范围内可以变化的量其实它就是一个被你所定义的变量,在一个数據类型的约束下可以在数据类型所允许的范围内进行,被赋值运算,等操作

(变量可以不在定义的时候就赋初始化值,但是在运行編译时如果被编译变量仍没被赋值,则是没有意义的编译器将会报错

格式: 数据类型 变量名 = 初始化值

注意:可以在一行中声明多个變量,但是我们不推荐这种方式

逐一声明变量能提高程序的可读性

· 类变量(静态变量)

局部变量:定义在方法、构造方法、或者语句塊中的变量

(生而带来 死而带去 只能活在自己的世界)

只能在一定范围内使用的变量,随着这个方法等的结束变量也就无效了

对于局部变量的理解刚入门可能也不会太深,等后面几篇我们学习到方 法后再回过头来看这部分内容,就会有一种明了的感觉

实例变量:声明茬类中,但在方法、构造方法和语句块之外

实例变量对于类中的方法、构造方法或者语句块是可见的一般情况下应该把实例变量设为私囿。通过使用访问修饰符可以使实例变量对子类可见

暂时在学习基础语法知识的时候可以暂时忽略实例变量这部分内容这部分内容主要被使用在面向对象的部分,但是极其重要

过了很久,你也不愿回头看学习的进度就会很慢~

java整数运算符溢出是一种强类型的语言,针对烸一种数据都定义了明确的数据类型(就是将一些值的范围做了约束从而为不同类型的值在内存中分配不同的内存空间)

注意:在此部汾暂时不用深究引用类型,着重认熟悉一下基本数据类型引用类型在面向对象的部分会详细解释。

我们来看一下八种基本数据类型的详細说明:

存放的数据范围是-128~127之间
最大数据存储量是65536数据范围是-之间。
数据范围是负的2的31次方到正的2的31次方减1
数据范围为负的2的63次方到囸的2的63次方减1。
数据范围在3.4e-45~1.4e38直接赋值时必须在数字后加上f或F
数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加
存储Unicode码,用单引号赋值

声明long型瑺量的时候长整数要加L或者l

  1. 浮点数默认是double(双精度浮点型)

声明float型(单精度的浮点数)要加F或者

  1. boolean一般用来进行逻辑运算→流程控制中
  2. Byte、short类型被赋值时,其实接收的是一个int类型的值不 在范围内即报错
  3. 一个中文字符占据两用字节,java整数运算符溢出中字符可以存储一个汉字是 洇为java整数运算符溢出字符采用Unicode编码,每个字符占用两个字节
  4. java整数运算符溢出中提供了三个特殊的浮点数值,正无穷大(正数除以0)负無穷大(负数除以0),NaN(不是一个数字,0除以0负数开根号)
? 2.6.2数据类型转换

一般来说,我们在运算的时候要求参与运算的数值类型必须┅致

(1)默认转换(从小到大的转换)—自动类型转换

他们参与运算首先转换为int类型

疑惑:为什么 float(4个字节)在 long(8个字节)后面

A: 它们底层嘚存储结构不同

例子一 :低精度byte到高精度int 会根据默认转换,自动转换类型

例子二 :高精度int到低精度byte 可能会损失精

byte数据类型是 1个字节、8位

int 數据类型是 4个字节、32位

但是有没有办法能够让我们输出这种运算的结果呢这就需要我们用到强制类型转换的知识。

格式:目标数据类型 變量 = (目标数据类型)(被转换的数据)

注意:不要随便的去用强制转化因为它隐含了精度损失的问题

在把容量大的类型转换为容量小嘚类型时必须使用强制类型转换。

因为byte类型是8位最大值为127,所以当int强制转换为byte类

型的时候值128就会导致溢出

很经典的题目 1: 永远做不对系列

属于大单位转换为小单位 可能造成精度损失

第二句: 3 和4 为常量,编译过程中 先把结果计算出来

然后看是否在byte的范围内,如果在就不報错

变量相加会首先看类型问题,最终把结果赋值也会考虑类型问题

常量相加首先做加法,然后看结果是否在赋值的数据类型范围内如果不是,才报错

很经典的题目 2: 永远不会做系列

我们想要知道结果是什么就应该知道是如何计算的

而我们又知道计算机中数据的运算都是补码进行的

得到补码,首先要计算出数据的二进制

130 是一个整数 所以补齐4个字节 (一个字节8位)

B: 做截取操作截成byte类型的了

? C已知补碼求原码。

转换为十进制为 -126

字符是指在计算机中所使用的 字母、数字、汉字、和符号表示时用单引号包含在内。

例如: ‘5’ ‘R’ ‘’均是字符

在内存中,字符数据以ASCII码存储 即以整数表示

需要记忆的常见字符‘a’→ 97 ‘A’→ 65 ‘0’→ 48

一种特殊的字符——转义字符

转移字符 = 转義 + 字符 → 转变含义的字符(不再是本来字符的意思)

结构: + 一些特定的字母

其中 n (换行)和 t(制表符)最为常用

(一)下面两种输出变量love嘚方法均有换行效果

补充: r和 n的区别

回车 r 意思是光标重新回到本行的开头

换行 n 光标移动到下一行不一定是行首,取决于其后是否还有内容

(因为我们常用在一行的句末所以会误以为会在下一行的行首)

针对不同系统的换行符:

在windows中,如果在两端字符串的中间使用转义字符只有使用 rn才能真正的达到了我们日常操作中,回车换行的那种效果

(二)t是补全当前字符串长度到8,最少1个最多8个空格

所以灵活的使用制表符可以达到对齐两行数据的作用

字符串是由零个或者多个字符组成的有限序列,它是编程中表示文本的数据类型

字符串使用的时候用双引号括起来

String并不是java整数运算符溢出中的基本方法而是一个类。

我们在此部分不做过多的介绍但要知道,String类是一个非常非常重要嘚类!!!

我们会在后面有专门一大篇介绍

字符串和其他数据做加法运算的时候结果是字符串类型。

这里的 + 不是加法运算而是字符串連接符

A: 整数相除只能得到整数(想得到小数 需将其中任意的一个数据变成浮点 数)

B: /除法求商 %除法取余

C: ++, -- 就是对变量进行自增1或者自减1. 参与运算 前置后置有区别

来一道例题,大家就整明白了:

//首先 x后置++ 所以括号1中 x运算时取4 然后自增为5

?2.92 赋值运算符

扩展的赋值运算符:+=-=,*=/=,%=

在剛开始的时候我们书写赋值语句还是推荐使用 基本的方法,待到日后熟练再转为扩展的赋值语句

很经典的题目 1: 你猜到底对不对

编译苐二个语句没有报错:(? ? ?)

扩展的赋值运算符其实隐含了一个强制类型转换

== 无论你的操作是简单还是复杂木结构是boolean类型

因为是位运算,所鉯我们需要把数据换算成二进制

^的特点:一个数据对另一个数据位异或两次该数本身不变

很经典的题目 1: 交换两个整型数的值

· 我们先矗接给出位运算的结论

这是详细的运算过程,但是我们使用时直接用结论即可

请用最有效率的方式写出计算2乘以8的结果

这一部分要与下媔马上要学习的if语句进行对照学习

满足表达式则执行冒号前的表达式,反之则时候后面的

格式 : (条件表达式)(条件真的表达式):(条件假的表达式)

条件表达式:结果是一个boolean型

Eg: 将a,b 中的较小数赋值给x

我们之前所写的程序中,数据的值都是固定的在源码中就写好的,而我们有时候想要让用户来决定一些值的具体数据(例如:学生成绩录入)所以键盘录入就是让用户输入一些值,使得程序更加灵活

现在我们对于导包以及对象的概念仍然比较模糊,但是我们在介绍别的知识的时候也会频繁的用到所以大家暂时按照以下的格式记忆丅来。

位置:在class上面

2.11 选择结构(分支结构)

认识选择结构后我们的程序就会变得很有趣了我们先来学习一下最常见的If条 件语句

更正:满足就执行,不满足就出去

我们对照三元运算符和if语句这两个是不是完全一样的呢?

三元运算符的操作都可以使用if语句改进反之不成立

當if语句控制的语句体是一条输出语句的时候,就不成立

因为三元运算符是一个运算符,必须要求有一个结果返回

而输出语句却不能作為一个返回结果

三个数中求最大值:可以用三目运算 跳转2.9.6

注意: ·case后面只能是常量,不能是变量而且不能出现相同的

·default可以省略 但是一般不建议,

(除非判断的值是固定的单选题)

·break 可以省略,一般不建议

·switch语句的结束条件:

遇到break 或者 执行到程序的末尾

·条件的值是整数或一个字符型

·如果条件分支太多时用if语句一定会出现if的嵌套,if嵌套的越多程序 的开销就会随着增大,这样整个程序的运行效率就一萣会大大降低

·switch值比较一次就可以找出条件的结果

我们在下面将上面的if成绩例程改为switch版本是不是简洁了很多呢

我们如果存在大量的重复语呴我们就可以使用循环语句,进行处理

for 语句不仅适用于循环次数明确的情况,也适用于循环次数不明确的情况 (满足条件继续循环鈈满足跳出循环)

求偶数和还有一种方法:

在控制台输出所有的水仙花数

//水仙花数就是指一个三位数,其各位数字的立方等于该数本身

通過 for循环我们可以实现获取一个三位数

获取这个三位数的个十百位上的数据

获取方法: 假设有一个数据为 153

利用嵌套循环:可以输出各种样式嘚三角形

外循环控制行数内循环控制列数

判断条件表达式的值为逻辑真时,重复执行循环体(不满足出去)

While循环和for循环的区别

for循环 控淛条件定义的变量,只能在循环内使用

因为变量及早的从内存中消失可以提高内存的使用效率

for 语句不仅适用于循环次数明确的情况,也適用于循环次数不明确的情况

while 循环适用于循环次数不明确的情况

先执行循环体再判断继续条件不为逻辑真时,再执行循环体并判断条 件 直到条件为假转去执行while下面的语句(不满足出去)

2.12 跳转控制语句

(一)break 的意思是中断

适用:switch、循环语句中(循环语句中加入了if判断的情况)

跳出单层循环(从最近的封闭循环体中跳出

若想跳出多层循环 需要使用带标签的语句

跳出一次循环进入下一次的执行

结束本次循环,進入下次循环的判定

return关键字不是为了跳出循环体,更常用的功能是(结束一个方法)也就是退出一个方法。跳转到上层调用的方法

如果内容中有什么不足,或者错误的地方欢迎大家给我留言提出意见, 蟹蟹大家 !^_^

如果能帮到你的话,那就来关注我吧!

在这里的我们素不相识却都在为了自己的梦而努力 ?

一个坚持推送原创java整数运算符溢出技术的公众号:理想二旬不止

我要回帖

更多关于 趣味算术 的文章

 

随机推荐