gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:29:26 27 4
gpt4 key购买 nike

我仍然没有找到为什么最低的带符号负数没有等效的带符号正数的原因?为了简单起见,我的意思是 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 将返回相同的值,因为该位需要存储大的正值具有特殊的含义。

那么为什么要这样做呢?这样做的原因是,如果只有 n 位,则无法存储值 -2n - 1 到 2n - 1,因为有 2这里有 n + 1 个不同的数字,只有 2^n 个不同的位模式。因此,排除最大的正数可以在指定的位模式中保存所有不同的数字。

但是为什么要删除高值而不是低值呢?这是为了保持与无符号整数的二进制兼容性。在无符号整数中,值 0 到 2n-1 - 1 均使用标准的以 2 为基数的表示形式进行编码。因此,为了使无符号和有符号整数完全一致,无符号整数被设计为与前 2n - 1 个无符号整数(范围从 0 到 2)逐位等效。 n - 1 - 1,包含在内。此后,无符号值需要最高有效位来编码数字,但有符号值使用它作为符号位。

希望这有帮助!

关于c++ - 为什么 -INT_MIN = INT_MIN 在有符号的二进制补码表示中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25619198/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com