对于2 ^ 32内的溢出,不会抛出ArithmeticException

时间:2018-05-13 15:34:58

标签: java integer-overflow arithmeticexception

我知道指定一个大于2^32的数字有机会生成一个ArithmeticException,但今天我正在编程时:

int x = 65535
System.out.println(x * x);

Output: -131071

所以没有异常,只有意想不到的结果。

2 个答案:

答案 0 :(得分:1)

溢出

乘法不受保护以防止溢出。

您在此处看到的是整数溢出。如果您取最大整数structure(list(ID = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L, 37L, 38L, 39L, 40L, 41L, 42L, 43L, 44L, 45L, 46L, 47L, 48L, 49L, 50L, 51L, 52L, 53L, 54L, 55L, 56L, 57L, 58L, 59L, 60L, 61L, 62L, 63L, 64L, 65L, 66L, 67L, 68L, 69L, 70L, 71L, 72L, 73L, 74L, 75L, 76L, 77L, 78L, 79L, 80L, 81L, 82L, 83L, 84L, 85L, 86L, 87L, 88L, 89L, 90L, 91L, 92L, 93L, 94L, 95L, 96L, 97L, 98L, 99L, 100L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L, 37L, 38L, 39L, 40L, 41L, 42L, 43L, 44L, 45L, 46L, 47L, 48L, 49L, 50L, 51L, 52L, 53L, 54L, 55L, 56L, 57L, 58L, 59L, 60L, 61L, 62L, 63L, 64L, 65L, 66L, 67L, 68L, 69L, 70L, 71L, 72L, 73L, 74L, 75L, 76L, 77L, 78L, 79L, 80L, 81L, 82L, 83L, 84L, 85L, 86L, 87L, 88L, 89L, 90L, 91L, 92L, 93L, 94L, 95L, 96L, 97L, 98L, 99L, 100L), testauc = c("AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8838", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896", "AUC.score.0.8896"), value = c(0.834, 0.868, 0.8812, 0.8871, 0.8902, 0.8927, 0.8943, 0.895, 0.8963, 0.897, 0.8965, 0.897, 0.8979, 0.8983, 0.8982, 0.8983, 0.8982, 0.8981, 0.898, 0.8979, 0.8979, 0.8976, 0.8971, 0.8971, 0.897, 0.8964, 0.8963, 0.8961, 0.8963, 0.8956, 0.8942, 0.8948, 0.8948, 0.8943, 0.8942, 0.8942, 0.8941, 0.8942, 0.8935, 0.8935, 0.8937, 0.8928, 0.8928, 0.8929, 0.8933, 0.8931, 0.8936, 0.8934, 0.8932, 0.8927, 0.8922, 0.8919, 0.8917, 0.8918, 0.8913, 0.8915, 0.8914, 0.8912, 0.8909, 0.8906, 0.8903, 0.89, 0.8903, 0.8902, 0.8898, 0.8898, 0.8893, 0.8895, 0.8893, 0.8894, 0.8893, 0.8888, 0.8884, 0.8878, 0.8876, 0.8874, 0.8871, 0.8871, 0.8874, 0.8871, 0.8869, 0.887, 0.8868, 0.8862, 0.8863, 0.8861, 0.8857, 0.8853, 0.885, 0.8849, 0.8854, 0.8847, 0.885, 0.8848, 0.8847, 0.8844, 0.8841, 0.8842, 0.884, 0.8838, 0.8377, 0.8733, 0.8844, 0.8901, 0.8929, 0.8953, 0.8971, 0.8978, 0.8983, 0.8982, 0.8992, 0.8995, 0.899, 0.8988, 0.899, 0.8987, 0.8986, 0.8987, 0.8984, 0.8987, 0.8985, 0.8987, 0.8983, 0.898, 0.8982, 0.8984, 0.8982, 0.8982, 0.898, 0.8982, 0.8982, 0.8981, 0.8977, 0.8978, 0.8974, 0.8976, 0.8976, 0.897, 0.8968, 0.8966, 0.8965, 0.8962, 0.8961, 0.896, 0.8958, 0.8954, 0.8956, 0.8953, 0.8951, 0.8951, 0.895, 0.8948, 0.8946, 0.8949, 0.895, 0.8948, 0.8948, 0.8948, 0.8946, 0.8946, 0.8943, 0.8943, 0.8943, 0.894, 0.8937, 0.8936, 0.8932, 0.8932, 0.8928, 0.8927, 0.8926, 0.8925, 0.8924, 0.8921, 0.8919, 0.8919, 0.8915, 0.8914, 0.8913, 0.8913, 0.8915, 0.8914, 0.8914, 0.891, 0.8912, 0.891, 0.8908, 0.8911, 0.8913, 0.8912, 0.891, 0.8909, 0.8908, 0.8906, 0.8901, 0.8899, 0.89, 0.8894, 0.8897, 0.8896)), .Names = c("ID", "testauc", "value"), row.names = 28801:29000, class = "data.frame") 并添加matching <- as.data.frame(matching) %>% mutate(group_id = rownames(.)) %>% gather(-group_id, key = key, value = group) %>% select(-key) %>% mutate(group = as.character(group * 10000)) matching <- matching[!matching$group == 10000, ] data_1 <- left_join(data_1, matching) data_2 <- left_join(data_2, matching) train_auc <- ggplot(data_1, aes(ID)) + geom_line(aes(y = value, colour = factor(group_id))) + theme(legend.position="none") train_auc test_auc <- ggplot(data_2, aes(ID)) + geom_line(aes(y = value, colour = factor(group_id))) + theme(legend.position="none") test_auc ,则会获得最小整数Integer.MAX_VALUE

1

这里也是如此,因为

INTEGER.MIN_VALUE

int value = Integer.MAX_VALUE; System.out.println(value); // 2147483647 value++; System.out.println(value); // -2147483648

的范围

在Java 65_535 * 65_535 = 4_294_836_225 > 2_147_483_647 中是一个带符号的32位值。特别是,未签名

int

异常

乘法抛出int。据我所知,只有除以 | min-value | max-value | -----------------|----------------|---------------| signed-32-bit | -2^31 | 2^31 - 1 | | -2_147_483_648 | 2_147_483_647 | -----------------|----------------|---------------| unsigned-32-bit | 2^0 - 1 | 2^32 - 1 | | 0 | 4_294_967_295 | 才会发生这种情况,因为根据定义,这是不可能的。另请参阅例外的documentation

对于受保护的乘法,请考虑使用ArithmeticExceptiondocumentation)。

答案 1 :(得分:1)

我认为你对于 32 位的int类型与它所代表的数字之间的位数有多少混淆:

#buttons {
  margin: 0 auto;
}
.slide {
  margin-top: 20px;
  text-align: center;
}
.buttonright, .buttonleft {
  border-radius: 4px;
  background-color: black;
  border: none;
  color: #FFFFFF;
  text-align: center;
  font-size: 17px;
  width: 90px;
  cursor: pointer;
  transition: all 0.5s;
}

因为它也代表负数,并且只能代表 2 ^ 31