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 不规则 拼图

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

  1. java jedis使用_Java中使用Jedis操作Redis

    Java中使用Jedis操作Redis 使用Java操作Redis需要jedis-2.1.0.jar,下载地址:http://files.cnblogs.com/liuling/jedis-2.1.0 ...

  2. java时间设置_JAVA中的时间操作

    java中的时间操作不外乎这四种情况: 1.获取当前时间 2.获取某个时间的某种格式 3.设置时间 4.时间的运算 好,下面就针对这四种情况,一个一个搞定. 一.获取当前时间 有两种方式可以获得,第一 ...

  3. Java中不一致的操作会扩大规则

    总览 当您在Java中执行一元或二进制操作时,标准行为是使用最宽的操作数(或对byte , short和char使用更宽的操作数). 这很容易理解,但是如果考虑最佳类型可能会造成混淆. 乘法 当执行乘 ...

  4. java pdf库_Java中常用的操作PDF的类库

    iText iText是一个能够快速产生PDF文件的java类库.iText的java类对于那些要产生包含文本,表格,图形的只读文档是很有用的.它的类库尤其与java Servlet有很好的给合.使用 ...

  5. java jsonobject 赋值_Java中JSONObject相关操作

    maven项目pom配置: net.sf.json-lib json-lib 2.4 jdk15 importnet.sf.json.JSONObject;//报文 String report=&qu ...

  6. java中的文件_JAVA中文件的操作

    在java中,对文件(例如图片)进行操作,包括上传.修改.删除 一,文件上传 1.文件传到哪里,不仅可以保存在数据库中,也可以上传到远程服务器,文件保存的是文件的路径 2.文件上传都需要做什么?写那些 ...

  7. java有道_java中的各种流(老师的有道云笔记)

    内存操作流-字节 之前的文件操作流是以文件的输入输出为主的,当输出的位置变成了内存,那么就称为内存操作流.此时得使用内存流完成内存的输入和输出操作. 如果程序运行过程中要产生一些临时文件,可采用虚拟文 ...

  8. java voliate关键字_java中voliate关键字有什么用?

    1.保证内存可见性 内存可见性,即线程A对volatile变量的修改,其他线程获取的volatile变量都是最新的. 说到内存可见性就必须要提到Java的内存模型,如下图所示: 如上图所示,所有线程的 ...

  9. java mod %区别_Java中 % 与Math.floorMod() 区别详解

    %为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...

最新文章

  1. 配置jdk相关的记录
  2. 在Myeclipse里使用Junit
  3. 【Flask】ORM高级操作之排序和分页操作
  4. 关于ZooKeeper集群脑裂及其解决方案
  5. 【JavaScript】关于delete
  6. Hessian Spring相关使用的简单例子
  7. jmeter 非GUI模式下测试报错An error occurred: Unknown arg:
  8. java中的getinstance_Java中的KeyPairGenerator getInstance()方法
  9. 利用哈夫曼编码英文字母表
  10. Android开发系列(十一) QQ登陆界面——Android控件使用实例
  11. 如何减小电压跟随器输出电阻_河南安全型耦合器生产厂家-作用_华锐矿机
  12. CNN网络详细讲解,可视化图例解读
  13. 什么会影响网站网页的打开速度
  14. C语言qsort函数对二维数组排序的不同情况
  15. 中国 软件与计算机 清华 教授,中国人民大学信息学院计算机软件与理论导师介绍:孟小峰...
  16. # 可视化常见绘图(二)折线图
  17. 深度摄像头ORBBEC Dabai Pro调试
  18. Evading Deepfake-Image Detectors with White- and Black-Box Attacks
  19. 华为和腾讯计划推出低价智能手机
  20. Excel可视化图形大全(一)——糖潮丽子的博客

热门文章

  1. nssl1319-埃雷萨拉斯寻宝【SPFA,建图】
  2. POJ1151-Atlantis【线段树,扫描线,离散化】
  3. 2021牛客暑期多校训练营4 E-Tree Xor(异或+思维+区间交 or Trie树)
  4. Codeforces Round #665 (Div. 2)
  5. 暗黑破坏神(ssl 2295)
  6. codeforces G - Almost Increasing Array 动态规划、动态开点线段树
  7. 实战 | 利用Delta Lake使Spark SQL支持跨表CRUD操作
  8. JVM 优化经验总结
  9. Oracle入门(十三B)之高级查询(上)
  10. hql投影查询之—— [Ljava.lang.Object; cannot be cast to cn.bdqn.guanMingSys.entity.Notice