java 不规则 拼图_Java中不一致的操作会扩大规则

java 不规则 拼图

总览

当您在Java中执行一元或二进制运算时,标准行为是使用最宽的操作数(或对于byteshortchar ,使用更大的操作数)。 这很容易理解,但是如果考虑最佳类型可能会造成混淆。

乘法

当执行乘法时,您得到的数值通常比单个数值大得多。 即| a * b | >> | a | 和| a * b | >> | b | 通常是这种情况。 对于小型字体,这可以按预期工作。

考虑以下程序:

public static void main(String[] args) throws IOException {System.out.println(is(Byte.MAX_VALUE * Byte.MAX_VALUE));System.out.println(is(Short.MAX_VALUE * Short.MAX_VALUE));System.out.println(is(Character.MAX_VALUE * Character.MAX_VALUE));System.out.println(is(Integer.MAX_VALUE * Integer.MAX_VALUE));System.out.println(is(Long.MAX_VALUE * Long.MAX_VALUE));
}static String is(byte b) {return "byte: " + b;
}static String is(char ch) {return "char: " + ch;
}static String is(short i) {return "short: " + i;
}static String is(int i) {return "int: " + i;
}static String is(long l) {return "long: " + l;
}

打印:

int: 16129
int: 1073676289
int: -131071
int: 1
long: 1

只有byte * byteshort * short不会溢出,因为它们已被扩展。 char * char即使允许,也不是有意义的操作。 但是int * int确实会溢出,即使我们有一个长类型也可以存储此值而不会溢出。 byteshort都隐式加宽,但不是int 。 应该真正地将long扩展,但是我们没有一个更宽泛的基本类型,这曾经是有意义的,但是如今64位基本类型看起来并不那么长。

从除数可以扩大结果的意义上讲,除法有些奇怪。 除数比分子宽并不意味着结果会更大(但通常会更小)

System.out.println(is(Byte.MAX_VALUE / (byte) 1));
System.out.println(is(Byte.MAX_VALUE / (short) 1));
System.out.println(is(Byte.MAX_VALUE / (char) 1));
System.out.println(is(Byte.MAX_VALUE / (int) 1));
System.out.println(is(Byte.MAX_VALUE/ (long) 1));

版画

int: 127
int: 127
int: 127
int: 127
long: 127

当你把一个byte/byte你会得到一个int即使你不能得到比一个大的值byte 。 (除非您将Byte.MIN_VALUE除以-1(在这种情况下, short会这样做),并且如果将byte/long除以byte/long即使值仍然不能大于byte您也会得到long

模量

当执行模数a % b ,结果不能大于b 。 但是模数会扩大结果而不是减少结果。

System.out.println(is(Byte.MAX_VALUE % Byte.MAX_VALUE));
System.out.println(is(Byte.MAX_VALUE % Short.MAX_VALUE));
System.out.println(is(Byte.MAX_VALUE % Character.MAX_VALUE));
System.out.println(is(Byte.MAX_VALUE % Integer.MAX_VALUE));
System.out.println(is(Byte.MAX_VALUE % Long.MAX_VALUE));System.out.println(is(Byte.MAX_VALUE % (byte) 2));
System.out.println(is(Short.MAX_VALUE % (byte) 2));
System.out.println(is(Character.MAX_VALUE % (byte) 2));
System.out.println(is(Integer.MAX_VALUE % (byte) 2));
System.out.println(is(Long.MAX_VALUE % (byte) 2));

版画

int: 0
int: 127
int: 127
int: 127
long: 127
int: 1
int: 1
int: 1
int: 1
long: 1

如果将X乘以一个数字,结果将不会比X宽/大,只能变小。 但是,捷豹路虎say必须扩大范围。 如果将X乘以一个byte ,则结果只能在一个byte的范围内。

我还提到了一元运算,也许最简单的是一元减号。

System.out.println(is(-Byte.MIN_VALUE));
System.out.println(is(-Short.MIN_VALUE));
System.out.println(is(-Character.MIN_VALUE));
System.out.println(is(-Integer.MIN_VALUE));
System.out.println(is(-Long.MIN_VALUE));

版画

int: 128
int: 32768
int: 0
int: -2147483648
long: -9223372036854775808

在前三种情况下,类型扩大了。 一个byte可以扩大到short ,但是作为一个int是正确的。 但是对于intlong ,它并没有扩大,您可能会遇到罕见的溢出。

一元奇数是一元加号,它不会更改值(因此无法更改其范围),但可以扩大值。

System.out.println(is(+Byte.MIN_VALUE));
System.out.println(is(+Short.MIN_VALUE));
System.out.println(is(+Character.MIN_VALUE));
System.out.println(is(+Integer.MIN_VALUE));
System.out.println(is(+Long.MIN_VALUE));

版画

int: -128
int: -32768
int: 0
int: -2147483648
long: -9223372036854775808

我们可以解决这个问题吗?

不幸的是没有。 有太多代码依赖于此逻辑。 例如说你写这样的东西。

long i = ...
byte b = ...
long l = i % b + Integer.MAX_VALUE;

如果i%b要从long变为byte ,则此表达式可能会溢出。

结论

Java可以在需要时扩展某些值,但也不能扩展某些int操作,这实际上应该很long 。 即使这可能更合乎逻辑,它也永远不会给出更窄的结果。

我们需要做的是了解边缘情况,尤其是int * int ,并在看到这样的操作时知道自己扩大它们。 例如

long l = (long) a * b;

除非我们确信a * b将适合int值。

翻译自: https://www.javacodegeeks.com/2015/02/inconsistent-operation-widen-rules-java.html

java 不规则 拼图

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

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

相关文章

账户的配置使您无法使用该计算机,2个方法解决“user profile service服务未能登录无法加载用户配置文件”...

win8/10系统:启动电脑显示windows标志时,长按电源键强行关机,重复此操作三次,系统将会进入“自动修复”。然后在“自动修复”界面中,选择“高级选项”>“疑难解答”>“高级选项”>“启动设置”>“重启”&a…

endp 汇编start_飞思卡尔Kinetis L 汇编语言启动文件startup_MK25Z4简单分析

打开Freedom KL25的例程包,任意找一个code example,以lower_power_dma_uart_demo为例,分析一下启动汇编文件的代码。代码主要分三部分:堆栈等的配置、向量表、初始启动跳转。1. 堆栈配置; Stack Configuration; Stack Size (in …

自定义ui_如何允许用户自定义UI

自定义ui理念 利用JavafX / FXML的声明性设计模式,并允许用户仅通过使用例如SceneBuilder打开某个视图即可重新定制布局或添加新控件,甚至根据用户需要更改样式,从而无需任何编码即可自定义某个视图。 FXML文件 CSS基本上可以放置在通过URL可…

C语言 | 内部与外部函数

C语言函数的声明和定义一个函数一般由两部分组成:声明部分执行语句C语言对变量而言,声明与定义的关系稍微复杂一些,在声明部分出现的变量有两种情况:一种是需要建立存储空间的。另一种是不需要建立存储空间的。前者称为定义性声明…

进程和线程计算机组成原理面试题,2016年云南财经大学信息学院计算机组成原理复试笔试最后押题五套卷...

一、选择题1. 设文件索引节点中有7个地址项,其中4个地址项为直接地址索引,2个地址项是一级间接地址索引,1个地址项是二级间接地址索引,每个地址项大小为4字节,若磁盘索引块和磁盘数据块的大小均为256字节&a…

获取客户端ip_代理IP工具能否解决反爬?

互联网已成了生活中的部分,从事互联网的工作者,避免不了需要去一些网站上进行爬取需要的数据来达到自己产品或者业务上的需求。比如反爬策略,但是,使用代理IP工具一定可以解决反爬虫策略吗?一、不同的网站有不同的反爬…

C语言 | 结构体数组

C语言结构体数组概述一个结构体变量中可以存放一组有关联的数据,如一个学生的学号、姓名、成绩等数据,如果有10个学生的数据需要参加运算,显然应该用数组,这就是结构体数组。结构体数组与之前介绍的数值型数组的不同之处在于每个数…

html弹窗代码y\/n,Nodejs扩展,实现消息弹窗(示例代码)

模块的C代码 node_gtknotify.cc#include #include #include #include #include using namespace v8;class GtkNotify : node::ObjectWrap{public:GtkNotify(){}~GtkNotify(){}std::string title;std::string icon;static Persistent persistent_function_template;static void …

LeetCode 每日一题 Day 21|| 堆

1962. 移除石子使总数最小 给你一个整数数组 piles ,数组 下标从 0 开始 ,其中 piles[i] 表示第 i 堆石子中的石子数量。另给你一个整数 k ,请你执行下述操作 恰好 k 次: 选出任一石子堆 piles[i] ,并从中 移除 floo…

python脚本语言采用声音作为手段_LKJ自动化测试脚本定义及生成技术研究

LKJ自动化测试脚本定义及生成技术研究白鸿钧,张明凯,李冠军,杨清祥【摘要】摘要:为实现对列车运行控制系统软件的自动化测试,在通用脚本语言的基础上定义专用的脚本语言,讨论专用脚本语言的结构和组成&…

java ee jsp_EE JSP:Servlet的反向外套

java ee jsp仅当页面数量少或需要对生成的内容(二进制PDF等)进行精细控制时,才可以从Servlet生成HTML。 对于大多数应用程序,输出将是HTML,我们需要一种更好的方法来完成此操作。 这就是JSP(Java服务器页面…

C语言 | 结构体指针

C语言指向结构体变量的指针在C语言中,指向结构体对象的指针变量既可以指向结构体变量,也可指向结构体数组中的元素。指针变量的基类型必须与结构体变量的类型相同。C语言中允许 (*p).num用p->num来代替 ->代表一个箭头 p-&g…

计算机网络安全管理协议,河西学院校园网络安全管理协议

第一条 总 则一.河西学院校园网络接入单位的所有用户必须遵守《中华人民共和国计算机信息网络国际联网管理暂行规定》、《河西学院校园网络管理暂行规定》及国家有关法律法规,严格执行安全保密制度,并对所提供的信息负责。二.河西学院校园网络的所有用户…

C语言 | 变量的存储方式

C语言动态存储方式与静态存储方式静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式;动态存储方式是在程序运行期间根据需要进行动态的分配存储空间的方式。内存中的供用户使用的存储空间可以分为3部分,程序区静态存储区动态存储区全局变量…

设计模式装饰者模式_装饰者模式如何拯救了我的一天

设计模式装饰者模式在工作中,我正在处理庞大的Java代码库,该代码库是由许多不同的开发人员在15年的时间里开发的。 并不是所有的事情都由书来完成,但是同时我通常无法重构遇到的每一个奇怪的事物。 尽管如此,仍可以每天采取提高代…

初学者选黑卡还是微单_明日之镜 十年索尼微单和他的镜头王国

2010年索尼微单诞生,与之一同而来的还有全新的E卡口。十年间,E卡口从APS-C走向了全画幅,从静态影像走向了专业摄像。并且准瞬间通过机器与机器、镜头与镜头架起了消费级与专业级的桥梁。想来一个卡口创作无限界大抵就是如此吧。起源一枚扫街用…

建德有没有计算机培训,建德计算机培训,建德计算机培训班,建德计算机培训完好找工作吗 - IT教育频道...

建德计算机培训首页>计算机> 建德计算机培训作者:镀金池 发布时间:2018-10-09在面向对象编程中,我们见过对象(object)。若是Context 对象想要在办事外部的事务产生时被告诉,那就需要把本身注册到办事的监听器中。将请求天…

C语言 | 字符数组

C语言字符数组的定义字符数组是用来存放字符数据的数组,字符数组中的一个元素存放一个字符,定义字符数组的方法和定义数值型数组的方法类似。//例子:char character[10];C语言字符数组的初始化C语言对字符数组初始化,最容易理解的…

python删除字符串中指定_python删除字符串中指定字符

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技术人对外发布原创技术内容的最大平台&…

linux暗转旧版java_Java旧版不断发展

linux暗转旧版java最近&#xff0c;我偶然发现了JDK API的一个非常有趣的警告&#xff0c;即Class.getConstructors()方法。 它的方法签名是这样的&#xff1a; Constructor<?>[] getConstructors()有趣的是&#xff0c; Class.getConstructor(Class...)返回一个Constr…