为什么 -INT_MIN = INT_MIN 在有符号的二进制补码表示中?

2024-05-04

我仍然没有找到为什么最低的有符号负数没有等效的有符号正数的原因? 为简单起见,我的意思是 3 位二进制数 100 是-4?但我们不能有符号格式的正 4,因为我们不能。它溢出了。 那么我们如何知道补码 1000 是 -4 1000 0000 是 -128 等等?我们没有原始正数


一种思考方式是,带符号的二进制补码格式的工作原理是为每个位分配 2 的幂,然后翻转最后一个 2 的幂的符号。例如,我们看-4,它表示为 100。这意味着该值为

-1 x 2^2 + 0 x 2^1 + 0 x 2^0

如果我们想得到这个值的正数,我们必须对它求反才能得到

 1 x 2^2 - 0 x 2^1 - 0 x 2^0

请注意,该值等于

 1 x 2^2 + 0 x 2^1 + 0 x 2^0

换句话说,该值的正常二进制表示形式是 100。但是,我们在这里遇到了麻烦,因为我们使用的是带符号的二进制补码表示形式,这意味着我们专门保留了 4 位作为符号位。因此,当我们尝试将位模式 100 解释为有符号的三位二进制补码值时,它的返回值与我们开始时的值相同。比特的短缺是这里的问题所在。

更一般地,给定 n 位,其中第一个是二进制补码表示中的符号位,尝试计算 -1000...00 将返回相同的值,因为存储大正值所需的位具有特殊的赋予它的意义。

So why do this at all? The reason for this is that if you have only n bits, you cannot store the values -2n - 1 through 2n - 1, because there are 2n + 1 different numbers here and only 2^n different bit patterns. Excluding the largest positive number thus makes it possible to hold all the different numbers in the bit pattern specified.

But why drop the high value and not the low value? This is in order to preserve binary compatibility with unsigned integers. In an unsigned integer, the values 0 through 2n-1 - 1 are all encoded using the standard base-two representation. Consequently, for unsigned and signed integers to agree at all, the unsigned integers are designed so that they are bit-for-bit equivalent with the first 2n - 1 unsigned integers, which range from 0 to 2n - 1 - 1, inclusive. After this, the unsigned values need the most significant bit to encode numbers, but the signed values are using this as the sign bit.

希望这可以帮助!

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

为什么 -INT_MIN = INT_MIN 在有符号的二进制补码表示中? 的相关文章

随机推荐

  • 如何处理 UICollectionView CompositionalLayout 中的空项目部分

    我正在尝试使用具有多个部分的组合布局制作集合视图 但如果部分中有空项目我该如何处理 如果项目为空 我不想显示该部分 UICollectionViewCompositionalLayout section env gt NSCollectio
  • 获取字典中相似值的键的最有效方法

    我有一个对象字典 I have thousands of objects in my real world scenario dic k1 obj1 k2 obj2 k3 obj3 keys are string objs are MyOb
  • 带有输出文件和屏幕输出的 sqlcmd

    我使用 sqlcmd 执行一些命令行批处理 bat 如下所示 sqlcmd i Scripts STEP01 sql o PROCESS log S MYSERVER E d MYDATABASE 我需要一个输出文件 当前有效 以及通过屏幕
  • 零填充缓冲区/文件的 CRC32 计算

    如果我想计算大量连续零字节的 CRC32 值 在给定零运行长度的情况下 是否可以使用恒定时间公式 例如 如果我知道我有 1000 个字节全部用零填充 有没有办法避免 1000 次迭代的循环 只是一个例子 对于这个问题 实际的零数量是无限的
  • 我们可以从视图调用控制器的方法(理想情况下我们从助手调用)吗?

    在 Rails MVC 中 您可以从视图调用控制器的方法 因为方法可以从助手调用 如果是 怎么办 答案如下 class MyController lt ApplicationController def my method Lots of
  • 许可证密钥模式检测? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 这不是真实情况 请忽略您可能认为适用的法律问题 因为它们并不适用 假设我有一组 200 个已知的有效许可证密钥 用于假设的软件许可算法
  • PyGTK+3(PyGObject)创建屏幕截图?

    我过去 3 天在 google 上搜索 如何使用 PyGTK 3 创建屏幕截图 有关于 pyqt pygtk 2 wx 和 PIL 的 gallizion 教程 顺便说一句 我不需要 scrot imlib2 imagemagick 等外部
  • 使 C# 源代码作为脚本运行?

    我正在编写一些脚本 我发现有时更多的功能会更好 就像持续尝试以 1 秒延迟删除文件并使其可移植的能力一样 我今天花了一些时间将 bat 脚本翻译为 bash 我知道我可以使用 php 或 python 但我非常喜欢静态 编译时间检查 有没有
  • 有可能吗?:行为 t [行为 t a] -> 行为 t [a]

    有没有办法有一个Behavior t a 其中 a 在时间 t 的值是 a 中包含的值Behavior t Behavior t a 在时间 t 即 具有以下类型的函数 Behavior t Behavior t a gt Behavior
  • 两种 SQL 连接符号有什么区别?

    SQL 1 select from t1 join t2 on t1 f1 t2 f2 SQL 2 select from t1 t2 where t1 f1 t2 f2 他们返回的结果是相同的 它们之间有什么区别吗 例如 DBMS 如何运
  • 在 C# WPF 或 Windows 窗体应用程序中使用 DirectX c++ DLL

    我用c 编写了一个DX11渲染器 我现在正在寻找一种方法来实现它的编辑器 GUI 由于我非常习惯 Windows 窗体和 WPF C 应用程序 因此我正在考虑将渲染器放入 dll 中 从 C 应用程序加载 dll 并使用它绘制到表单的定义部
  • gnuplot:如何获得正确的数量级?

    这个问题 问题可能与这个话题 https stackoverflow com questions 55130265 inconsistency with gnuplot format specifiers t and t 如果您输入 pri
  • 从 XML 资源创建 hashmap/map

    我正在制作一个应用程序 其中 Web 服务从 Web 服务 即 BEL FRA SWE 获取 除其他外 一堆代码 在运行时 我想将这些代码翻译成适当的名称以显示给用户 即比利时 法国 瑞典 可能有很多这样的代码 所以我想知道是否有任何适当的
  • 有没有办法设置独立 TableView 列的样式?

    我可以使用 CSS 来设置单元格样式 但如果我只想为一列使用不同的样式 例如使用不同的文本颜色 怎么办 也许我错过了一些东西 你应该使用TableColumn setCellFactory http docs oracle com java
  • 如何以编程方式更新 SharePoint Web 部件中的内容?

    有人知道如何以编程方式更新任何标准 SharePoint v3 Web 部件的内容吗 例如 将链接摘要 Web 部件放置在页面上 添加一些链接 现在 我如何使用 WSS API 更新此信息 我还没有找到任何直接的方法来执行此操作 到目前为止
  • 后续交易不会更新 Hyperledger Fabric 中的账本,产生图标一致状态

    我正在做一个小项目来让自己熟悉超级账本结构 https hyperledger fabric readthedocs io en release 1 1 目前 我有一个小型网络 由单个对等点 排序者和 ca 节点 加上 cli chainc
  • 将数据导入 MySQL Workbench

    我有一个包含 6 个表的数据库 我想将这些表导入到existingMySQL Workbench 中的数据库 我使用 phpMyAdmin 将数据库导出到 sql文件 并使用 数据导入 恢复 按钮将其导入到 MySQL Workbench
  • EF 型号。导航属性只能参与单个关系

    我有这样的实体 它们紧密相连 public class Game public int Id get set public int FirstTeamId get set public Team FirstTeam get set publ
  • 增加 .fig 文件中的散点标记大小

    我有一个图形文件 scatter fig 该图有许多使用 scatter 的散点绘图仪 现在我只有这个无花果文件 我需要增加所有散点的标记大小 手动尝试过 但非常困难 有没有办法我可以做类似的事情 H 图形句柄 s 点 h 设置 s 标记大
  • 为什么 -INT_MIN = INT_MIN 在有符号的二进制补码表示中?

    我仍然没有找到为什么最低的有符号负数没有等效的有符号正数的原因 为简单起见 我的意思是 3 位二进制数 100 是 4 但我们不能有符号格式的正 4 因为我们不能 它溢出了 那么我们如何知道补码 1000 是 4 1000 0000 是 1