我正在从Cay S. Horstmann的"真正不耐烦的Java SE 8"一书中进行练习。 基于Number类的改进的一项练习要求:

Write a program that adds, subtracts, divides, and compares numbers

between 0 and 232 - 1, using int values and unsigned

operations. Show why divideUnsigned and remainderUnsigned are

necessary.

问题是,如果您添加2个无符号整数,则总和可能会超出整数限制。 我看不出有一种方法可以避免这种情况,而无需花费很长的时间来存储总和并检查它是否大于Integer.MAX_VALUE。 是否可以仅使用int做到这一点?

用于整数值的二进制补码具有整洁的属性,即将值解释为带符号还是无符号,与加减运算无关。

因此,即使在CPU级别上,也没有用于添加/减去带符号或无符号数字的明确指令。这一切都与解释有关。

因此,当您使用带符号的int类型添加或减去两个无符号的数字时,结果可能会在带符号的int范围内溢出。但是,当使用Integer.toUnsignedString打印负数时,结果将是正确的无符号值,前提是该操作甚至没有在无符号整数值范围内溢出。

这就是为什么类java.lang.Integer仅在必要时提供特殊的无符号操作的原因,即,用于比较两个无符号值,除法和余数以及从和向String(以及向long的转换),而从到int已经足以用于另一个方向)。

感谢您的答复。我不确定问题是否仅与打印有关。如果返回了溢出值,并且将其用于其他操作,则它将是错误的。在这种情况下,Java 8中引入的"精确"操作intValueExact会引发异常。

由于练习要求使用int进行计算,因此无法解决。当然,您可以以安全的方式定义计算的API,即可以使用Integer.toUnsignedLong以不会被误解的形式返回值(使用int计算出的值)。当然,如果使用toUnsignedString"计算" !="返回类型"将结果作为String返回,则结果相同。

我希望有更多的东西。如果您阅读该问题,它将说"使用int值和无符号操作"。如果创建一个使用+运算符添加2个整数的方法似乎很简单。除非缺少某些内容,否则练习不会增加任何价值。

也许您应该专注于练习的最后一句话:"说明为什么需要divideUnsigned和remainderUnsigned"。这意味着您应该深入研究2的补数,以了解为什么它适用于+,-和*,但不适用于和%,因此您将了解为Java 8添加了这两种支持方法,但没有addUnsigned等。

为了获取无符号的int,您需要使用Integer.parseUnsignedInt()函数或进行手动计算。请记住,Java实际上并没有无符号整数,Java8只是提供了将int视为无符号整数的功能,以便允许更大范围的正数值。

根据Java 8 Doc for Integer类,

An unsigned integer maps the values usually associated with negative

numbers to positive numbers larger than MAX_VALUE

因此,无符号整数和有符号整数之间的转换是,如果数字大于或等于零且小于或等于Integer.MAX_VALUE,则它保持不变。如果它大于Integer.MAX_VALUE但仍在无符号范围内,则要将其存储在int中,您需要向其添加2 ^ 31,由于加法溢出的方式,会将其转换为正确的值定义为操作。除了二进制原语(如int)外,上溢和下溢只会导致计数器复位并继续计数。

int min = Integer.MIN_VALUE;            // -2147483648

int max = Integer.MAX_VALUE;            // 2147483647

int overByOne = Integer.MAX_VALUE + 1;  // -2147483648 : same as Integer.MIN_VALUE

int underByOne = Integer.MIN_VALUE - 1; // 2147483647 : same as Integer.MAX_VALUE

他们的练习只是要求您查看Integer类并测试各种(未使用Java8的)未签名操作的方法。 Java没有无符号的整数基元,但是出于Integer类中某些新方法的目的,可以将int值视为无符号的。

java 加法 溢出_关于数字:Java 8 Unsigned Integer加法和潜在的溢出相关推荐

  1. 马士兵 java 学习笔记_马士兵java教程笔记1

    ---恢复内容开始--- 前记 虽然已经是个研究生了,但是会的东西还是特别的少 甚至连java都不能说是很会 所以准备从现在开始能好好的学习java 变成java master 标识符 标识符是由字母 ...

  2. A002、java环境搭建_第一个java程序

    目录 1.内容介绍 2.软件开发概述 2.1 软件开发概念 2.2 软件开发示例 2.3 软件开发语言 2.3.1 计算机语言概述 2.3.2 计算机语言分类 2.4 小结 3.Java概述 3.1 ...

  3. java datetime 转换_如何实现Java日期时间格式转换

    Java日期时间以及日期相互转换 Java日期时间,以及相互转化,供大家参考,具体内容如下 package com.study.string; import java.text.ParseExcept ...

  4. java 02-cf_cf活动如何设置java环境变量_如何设置java环境变量

    cf助手怎么连接wifi_连接无线网设置 对于刚刚学习java的win7用户来说,首先要学会安装jdk和配置java环境变量,这是学习java的唯一途径,否则编写的代码运行时会出现bug.关于这一点, ...

  5. java 字符串乱码_这份Java面试题含答案解析竟然真的让你不用在面试上“如履薄冰”...

    面试题集共分为以下十部分: 一.Core Java: 1 - 95 题1 - 24 页 基础及语法: 1 - 61 题1 - 13 页 异常: 62 - 69 题13 - 15 页 集合: 70 - ...

  6. java console 交互_实例讲解java中Console类的用法

    java的Console类的使用方法及实例 java的Console类的使用方法及实例 JDK 6中提供了java.io.Console类专用来访问基于字符的控制台设备.如果你的Java程序要与Win ...

  7. java for循环_愉快地学Java语言:第五章 循环

    导读 本文适合Java入门,不太适合Java中高级软件工程师.本文以<Java程序设计基础篇>第10版为蓝本,采用不断提出问题,然后解答问题的方式来讲述.本篇文章只是这个系列中的一篇,如果 ...

  8. java 内存空间_怎样用java实现存储空间动态分配

    1.java是如何管理内存的 Java的内存管理就是对象的分配和释放问题.(两部分) 分配 :内存的分配是由程序完成的,程序员需要通过关键字new 为每个对象申请内存空间 (基本类型除外),所有的对象 ...

  9. linux java远程调试_[转]JPDA:Java平台调试架构(常用的远程调试方法)

    原文出处:http://www.javaeye.com/topic/75128 最近使用WTP的Server功能很不爽,连tomcat服务器时java类中的任何改动都要重启服务器,一怒之下就改用JPD ...

最新文章

  1. Ubuntu下安装zsteg隐写工具
  2. Python基础(注释/算数运算符/变量类型/拼接字符串)
  3. Parcelbale接口
  4. 这才是真相,“轻点,疼”被禁却另有玄机
  5. matlab+dds正弦表,FPGA模拟DDS正弦波信号源1
  6. iconfont图标引入
  7. Python——输入若干行,每行若干行整数,求所有整数的最大值
  8. Win10控制网卡启停脚本
  9. 【Web】CSS(No.21)Css经典案例(三)《爱宠知识》
  10. 远程桌面连接时无法访问远程计算机的计算机属性提示系统调用失败,远程过程调用失败【应对技巧】...
  11. 计算机软件水平考试分类程序员,历年计算机软件水平考试程序员部分真题
  12. MPC5748G笔记 PWM pwm_pal
  13. 等级保护测评—Windows
  14. dvwa页面打不开的原因_路由器管理页面打不开怎么办? | 192路由网
  15. HTML中对字体颜色稀色,平面设计之版式设计中常用到的对比手法
  16. java计算机毕业设计绿色生活基于PS、DW的绿色环保宣传网站源码+数据库+系统+lw文档+mybatis+运行部署
  17. AMD显卡如何用Anaconda安装pytorch
  18. Android中富文本用法包括点击事件处理
  19. 计算机音乐外国,趣闻,国内外大神教你,用计算器圆你的音乐梦
  20. Spring学习心得体会

热门文章

  1. 【Python】嵌套类的定义与使用
  2. fx5u以太网通讯设置_BCNet客户机实现S7300和FX5U数据交换
  3. AVC与H264 区别
  4. PyQt5系列(四)Mac10.12上安装Cocoapods
  5. android下watchprosp和svc命令
  6. Android常用权限permission列表摘录
  7. 28181之spvmn测试视频
  8. 人脸方向学习(九):Face Detection-MTCNN解读
  9. java 百度副文本_spring boot 、springMVC环境集成百度ueditor富文本编辑器
  10. 云桌面服务器资源计算机,桌面云服务器资源计算机