添加 MIN_VALUE 如何将整数与无符号整数进行比较?

2024-01-09

在Java中int类型是有符号的,但是它有a method https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html#compareUnsigned-int-int-比较两个整数,就好像它们是无符号的一样:

public static int compareUnsigned(int x, int y) {
    return compare(x + MIN_VALUE, y + MIN_VALUE);
}

It adds Integer.MIN_VALUE对每个参数,然后调用正常的有符号比较方法,即:

public static int compare(int x, int y) {
    return (x < y) ? -1 : ((x == y) ? 0 : 1);
}

怎么添加MIN_VALUE每个参数神奇地使比较无符号?


该技术适用于任何大小的整数,但我将使用 8 位字节大小的整数来解释,因为数字更小并且更容易使用。

An 8-bit type has 28 = 256 possible values. At a low level these are just bits, and signed vs unsigned is a matter of how we interpret those bits. When interpreted as an unsigned integer, they have a range of 0 to 255. When interpreted as a signed two's complement https://en.wikipedia.org/wiki/Signed_number_representations#Two.27s_complement integer, they have a range of −128 to +127.

类型的数轴如下所示:

请注意,从 0 到 127 的正数可以用有符号和无符号类型表示,并且它们由完全相同的位模式(00000000 到 01111111)表示。

在无符号解释中表示从 128 到 255 的大正数的位模式被重新用于有符号解释中的数字 -128 到 -1。就好像有人拿了无符号数轴,切掉了范围的上半部分,然后将其粘在了数轴的下端。

现在,让我们看看比较一对整数时会发生什么。

情况 1:两个值都在有符号正数范围内

由于这两个值都在 0 到 127 范围内,因此无论这些位被解释为有符号还是无符号,它们都具有相同的数值。

我们无条件地将 MIN_VALUE 添加到每个值。我们的有符号字节类型的 MIN_VALUE 是 -128,所以添加这意味着我们实际上是减法 128.

一个例子:我们的比较函数,使用有符号类型,给出x= 20 和y= 60. 添加 MIN_VALUE,我们得到x'= 20 − 128 = −108 且y'= 60 − 128 = −68:

将 MIN_VALUE 添加到正值将始终将其映射为负值。在该范围的最末端,0 将变为 -128,127 将变为 -1。该操作不会改变顺序x and y相对于彼此,因此之间的任何比较的结果x' and y'就像我们没有添加 MIN_VALUE 一样,这是正确的。

情况 2:两个值都在有符号负数范围内

在这种情况下,如果解释为有符号,则两个值都在 -128 到 -1 范围内。如果解释为无符号,它们的范围是 128 到 255(大 256)。

当我们无条件地将 MIN_VALUE 添加到每个带符号的负值时,它always导致溢出和环绕,变成带符号的正值。从数字上看,这种环绕与加 256 相同。如果我们给出x= −35 且y= −80 进行比较,我们得到x'= −35 − 128 + 256 = 93 且y'= −80 − 128 + 256 = 48:

我们还可以用 −35 和 −80 的无符号解释来可视化这一点,即 221 和 176。当减去 128 时,我们得到完全相同的结果x' and y'。二进制补码的优点之一是,无论将数据视为有符号还是无符号,加法和减法都会给出相同的结果,因此 CPU 可以使用相同的电路。

与情况 1 一样,该操作不会更改两个数字之间的任何比较结果。我们的x大于y(负值较小),以及x'也大于y'。因此这些输入之间的比较是正确的。

情况 3:一个值在有符号正数范围内,另一个为负数

这是一个有趣的案例。请注意,当我们添加 MIN_VALUE 时,它总是会更改数字的符号。正值映射到负值,负值映射到正值。

我们来比较一下x= −35 且y= 60。由于我们希望将它们作为无符号进行比较,因此我们确实打算x被解释为−35 + 256 = 221。所以x需要解释为大于y,即使我们的签名数据类型通常不会这样做。

由于数字具有相反的符号,因此更改符号的 MIN_VALUE 运算将反转数字在数轴上的顺序。x'= −35 − 128 + 256 =93, and y'= 60 − 128 =−68。所以我们得到x'大于y',这就是我们想要的:

概括

由于我们已经处理了正负的所有组合,因此我们知道该技术适用于所有可能的值。

对于 32 位整数,范围更大(有符号范围是 −2,147,483,648 (MIN_VALUE) 到 +2,147,483,647,无符号范围是 0 到 4,294,967,295),但工作原理是一样的。事实上,它适用于每种大小的整数以及每种编程语言,前提是:

  1. 有符号整数使用二进制补码表示(这几乎是通用的)。

  2. 加法在溢出时回绕(而不是引发错误或提升为更大的数字类型或未定义)。

您也可以执行相反的操作:如果您只有无符号整数类型,并且想要进行二进制补码有符号比较,请将有符号最小值(的无符号解释)添加到每个数字。

由于该技术只是两个无条件加法运算,因此即使编译器或虚拟机不进行特殊处理,它也非常高效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

添加 MIN_VALUE 如何将整数与无符号整数进行比较? 的相关文章

  • 日语/字符的编程技巧[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个想法 可以编写一些网络应用程序来帮助我 也许还有其他人 更好地学习日语 因为我正在学习日语 我的问题是该网站主要是英文的 所以
  • 包含范围内的随机浮点双精度

    我们可以很容易地得到所需范围内的随机浮点数 X Y 请注意 X 是包含在内的 Y 是不包含的 具有下面列出的函数 因为Math random 和大多数伪随机数生成器 AFAIK 产生数字 0 1 function randomInRange
  • 什么是自以为是的软件?

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 我经常看到人们说某些软件 非常固执己见 或者微软倾向于编写 不固执己见 的框架 这实际上意味着
  • Ruby 中的安全整数解析

    我有一根绳子 比如说 123 我想将它转换为整数123 我知道你可以简单地做some string to i 但这会转换 lolipops to 0 这不是我想要的效果 当我试图用一种美好而痛苦的方式转换一些无效的东西时 我希望它在我脸上爆
  • Ruby 比较运算符? == 与 === [重复]

    这个问题在这里已经有答案了 和 有什么区别 什么时候应该使用哪一个 两者都只是在对象上调用的方法 这意味着对象决定哪个意味着什么 然而 Ruby 中有一些关于它们之间差异的约定 通常 比 a b几乎总是为真 如果a b是 阅读此内容的最佳位
  • 如何处理复杂的事情?

    您知道代码中对于项目至关重要但可能需要花费大量时间才能完成的特定部分吗 您是否有过这样的感觉 您宁愿做其他事情 可能不太重要 或者根本不写代码 而不是做那部分 你竭尽全力避免并使用你所知道的每一个懒惰技巧来推迟其不可避免的实施的那头野兽 现
  • 仅具有副作用的方法的名称

    因此 改变其对象的方法是mutator 不改变其对象但返回值 或对值的引用 的方法是getter 是否有一个广泛使用的方法名称 该方法不会改变其对象 不返回值 但可能会改变作为参数传递给它的对象 也就是说 只有每个方法对参数有副作用时才会被
  • 我可以将 pandas.dataframe.isin() 与数字容差参数一起使用吗?

    我事先查看了以下帖子 有没有办法将 DataFrame isin 与近似因子或容差值一起使用 或者还有其他方法可以吗 如果列中的值位于一组值列表中 则过滤数据框行 https stackoverflow com questions 1206
  • 让人们在电影院就座

    这是基于我读到的一篇关于大型软件公司提出的谜题和面试问题的文章 但它有一个转折 一般问题 有一种算法可以让人们在电影院就座 让他们直接坐在朋友旁边 而不是敌人旁边 技术问题 给定一个 N M 网格 用 N M 1 项填充网格 每个项目都有一
  • 如何在 C# 中声明大整数

    下面的代码 C 中 是我尝试转换为 C 的代码 DWORD Func X 4 DWORD arg1 DWORD arg2 DWORD arg3 LARGE INTEGER result 1 0 LARGE INTEGER temp1 0 L
  • 如何抑制自己重写一切的强烈冲动?

    Setup 您是否有过这样的经历 在一段代码中进行看似简单的更改 然后意识到您刚刚踏入了一片值得认真关注的荒地 这通常会由官方跟进吓坏了那一刻 重写眼前一切的压倒性感觉开始蔓延 值得注意的是 这些糟糕的代码不一定来自其他人 因为它可能确实是
  • 额外的函数/方法定义是否会增加程序的内存占用?

    在 C 中 定义不使用的附加方法或函数是否会导致更大的内存占用或更慢的执行速度 基本上 我在一个类中有几种实用程序调试方法 这些方法对于该类的正常使用都不是必需的 如果从未使用过这些定义 是否保留这些定义会在内存占用或速度方面产生影响吗 例
  • 我可以在服务器端应用程序(PHP、Ruby、Python 等)上读取 URL 的哈希部分吗?

    假设 URL 为 www example com val 1 part2 PHP可以读取请求变量val1使用 GET 数组 是哈希值part2还可读吗 或者这仅取决于浏览器和 JavaScript 主要问题是浏览器甚至不会发送带有片段部分的
  • 如何在Prolog中编写cmp_list/3函数?

    Write a predicate cmp list 3 the first 2 arguments are 2 lists and the last one is Comparison which means ge lt le or gt
  • 如何从 PHP 字符串中获取 64 位整数哈希值?

    我需要 64 位字符串整数哈希值来实现哈希映射之类的功能 在我看来 没有可以返回 64 位整数的原生 PHP 哈希功能 我认为可以获取 sha1 哈希值的第一部分并将其转换为整数 然而 这不会带来最好的性能 而且转换似乎很棘手 当然 如果不
  • Python:如何在两个单独的数组之间找到两个相等/最接近的值?

    假设我们有两个长度相等的数组 arr1 21 2 3 5 13 arr2 10 4 5 9 12 20 哪个变量来自arr1 is 相等 最接近到一个变量arr2 看看这两个列表 我们可以很容易地说最接近的数字是4 5 and 5 我试图实
  • 在 Ruby 中模拟 int64 溢出

    我是一名资深程序员 但对 Ruby 还很陌生 我正在尝试移植一种名为 CheckRevision 的算法 用于在登录 Battle net 的在线游戏服务之前检查游戏文件的完整性 该算法使用给定的公式对文件进行 哈希 没有无聊的细节 而是不
  • 3 维装箱算法

    我面临着 3 维装箱问题 目前正在进行一些初步研究 了解哪些算法 启发式方法目前能产生最佳结果 由于问题是 NP 难问题 我不希望在每种情况下都能找到最佳解决方案 但我想知道 1 最好的精确求解器是什么 分支定界 我期望使用合理的计算资源可
  • 如何在Python中将列表中的整数相加(对数字列表求和)?

    假设我有一个整数列表 例如 2 4 7 12 3 我怎样才能将所有数字加在一起 以获得28 x 2 4 7 12 3 sum of all numbers sum x 或者你可以尝试这个 x 2 4 7 12 3 sum of all nu
  • 边界椭圆约束于水平/垂直轴

    背景 我正在尝试将地形图裁剪成围绕多个风力涡轮机的最小尺寸椭圆 以最小化地图的尺寸 执行此地图裁剪的程序可以裁剪椭圆 但仅限轴沿 x 轴和 y 轴对齐的椭圆 我知道边界椭圆问题的算法 https stackoverflow com ques

随机推荐

  • 脚本文件与命令行:rsync 和 --exclude

    我有一个简单的测试 bash 脚本 如下所示 bin bash cmd rsync rv exclude dir new cmd execute command 当我运行脚本时 它还会复制以 尽管我本想排除他们 当我直接从命令行运行相同的
  • 如何通过滑动动画以编程方式在 FlipView 中导航

    Windows 开发中心声明UseTouchAnimationsForAllNavigation财产 XAML FlipView 控件支持三种导航模式 基于触摸 基于按钮和程序化 当用户通过触摸导航时 FlipView 项目会平滑地滚动到视
  • sql注入场景中格式化函数与参数?

    我知道 sql 语句中参数的使用 但出于好奇 使用 Format 函数来防止 sql 注入而不是使用参数是安全的 像这个样本 sCustomer string begin AdoSql CommandText Format Select S
  • 故障排除“运行时编译器未加载”

    使用以下命令构建 Angular2 应用程序后 出现以下运行时错误 prod flag 运行时编译器未加载 据我了解 生产版本使用 AoT 并且在此场景中不支持运行时编译 我的问题是 我不知道我正在做的任何事情都需要运行时编译器 它甚至可能
  • 连接空间数据时如何解决球面几何故障

    我有一个形状文件 带有多个多边形 和一个带有坐标的数据框 我想将数据框中的每个坐标分配给形状文件中的多边形 因此 要在数据框中添加具有多边形名称或 ID 的列 这里是链接到数据 https docs google com spreadshe
  • 如何读取程序加载解决方案一部分的文件?

    我正在编写一个 C WinForms 应用程序 该应用程序的组件之一是 SQLite 数据库 如果用户第一次运行该程序 该程序应该在用户的主目录中创建必要的文件夹和文件 即数据库文件 效果很好 不过 还需要建立数据库 即需要添加表 我有一个
  • 不确定的 NSProgressIndicator 将不会动画

    所以我有一个简单的用户界面 一个 开始 按钮 一些文本 标签和一个进度栏 单击 开始 按钮时 NSProgressIndicatorshould动画 这是我的代码 synthesize progressBar progressBar Som
  • Turtle 模块 - 保存图像

    我想弄清楚如何在使用 python 的海龟模块创建绘图后保存位图或矢量图形图像 经过一番谷歌搜索后 我找不到简单的答案 我确实找到了一个名为画布2svg http wm ite pl proj canvas2svg index html 但
  • 为什么 Array.IndexOf 不像 List 那样检查 IEquatable ?

    考虑this https dotnetfiddle net RVgvG0 code public static void Main var item new Item Id 1 IList list new List
  • BeautifulSoup 找不到正确解析的元素

    我在用BeautifulSoup解析一堆可能非常脏的HTML文件 我偶然发现了一件非常奇怪的事情 HTML 来自这个页面 http www wvdnr gov http www wvdnr gov 它包含多个错误 例如多个
  • Angular 通用 + 外部 API

    我知道 Angular Universal 仍在开发中 因此 我考虑过将 Angular Universal 用于一个 Web 应用程序 该应用程序定期从外部 API 服务器提取数据 大约每 10 秒通过 Http 服务提取一次 然后 该数
  • 为什么 UIWebView 中的 Google 搜索结果没有触发 webViewDidFinishLoad?

    毫无疑问 这是一个关于网页的更普遍的问题 但通过 Google 内容很容易证明这一点 在 Google 主页上输入某些搜索条件时 结果不会触发webViewDidFinishLoad方法 当彩色 Google 徽标被链接到功能页面的某些艺术
  • 如何处理“一旦你的元素不再连接就可以调用connectedCallback”编码Web组件

    我的问题中粘贴的那句话是从https developer mozilla org en US docs Web Web Components Using custom elements Using the lifecycle callbac
  • 张量流 - 了解卷积的张量形状

    目前正在努力通过我的方式卷积网络的 Tensorflow MNIST 教程 https www tensorflow org get started mnist pros first convolutional layer我需要一些帮助来理
  • 如何在使用它的项目的多项目构建中开发 sbt 插件?

    是否可以在多项目设置中构建 sbt 插件 并在同一多项目的其他子项目中使用该插件 例如 root mySbtPlugin myProject project plugins sbt Uses mySbtPlugin It is not可能的
  • CSRF 令牌不匹配 Laravel 4

    这真让我抓狂 无论是来自 Laravel 表单还是来自 AJAX 我在每个 POST 上都会遇到令牌不匹配的情况 我在过滤器中添加了一些代码来显示会话与 token Route filter csrf function if SERVER
  • VBA列表框多列添加[重复]

    这个问题在这里已经有答案了 可能的重复 在具有多列的列表框中添加项目 https stackoverflow com questions 6973287 adding items in a listbox with multiple col
  • 如何从数组中获取前 N 个元素

    我正在使用 Javascript ES6 FaceBook React 并尝试获取大小不同的数组的前 3 个元素 我想做相当于 Linq take n 的事情 在我的 Jsx 文件中 我有以下内容 var items list map i
  • python3的最大整数值[重复]

    这个问题在这里已经有答案了 64位系统下python中整数的最大值是多少 我尝试了 sys maxsize 并尝试将值增加 1 并且仍然将类型显示为 int 如果转换为long数据类型 为什么不在末尾附加L 另外如何找到long类型的最大值
  • 添加 MIN_VALUE 如何将整数与无符号整数进行比较?

    在Java中int类型是有符号的 但是它有a method https docs oracle com javase 8 docs api java lang Integer html compareUnsigned int int 比较两