为什么 10000101 既是 -5 又是 133

why 10000101 is both -5 and 133

Vidoe

00000101 是 5

10000101 为 -5

但是 10000101 也是 133

我不明白为什么1个二进制可以表示2个数字。 感谢任何帮助,谢谢。

“礼物”这个词至少有两个意思。在英语中,这意味着你给某人的礼物。在德语中,它的意思是毒药。要知道说话者的意思是什么,你必须知道他们说的是哪种语言。

位串 10000101 本身没有任何意义。这只是一些位。位串只有在我们将它们与类型相关联时才具有值,类型是(部分)将值与位串相关联的方法。要知道它代表什么值,你必须知道它与哪种类型一起使用。

如果我们将10000101解释为纯二进制数字,则表示1•27 + 1•22 + 1•2 0 = 128 + 4 + 1 = 133.

如果我们将10000101解释为符号和大小表示,则表示负数 1•22 + 1•20 = − (4+1) = −5.

如果我们将10000101解释为二进制补码表示,则表示-1•27 + 1•22 + 1• 20 = −128 + 4 + 1 = −123.

在 C 语言中,每个声明的对象和每个常量都有一个类型,并且由这些东西构建的每个表达式都有一个类型。类型说明如何解释这些位。

在这些占一个字节的有符号数的表示中

00000101 is 5

10000101 is -5

最高位是符号位,决定存储的数是正数还是负数。

也就是说,如果设置了符号位,则取反存储在值位中的相应值。

这种有符号值的表示形式类似于符号和大小

有符号值的存储方式由实现定义。大多数计算机体系结构使用所谓的 2 的补码表示。对于这样的架构,负数 -5 表示为

11111011 is -5

如果数字被认为具有无符号整数类型,则不会将任何位分配为符号位。在这种情况下,所有位都是值位。因此对于无符号整数,此表示 10000101 产生值 133.

I don't understand why 1 binary is able to represent 2 numbers.

纯二进制数没有符号。

所以作为纯二进制,10000101 毫无疑问就是 133,很简单。

但是,当然,我们希望能够处理负数。所以有 various ways of rigging things up 这样一些位模式代表负数。但是一旦这样做,您将得到可以用两种方式解释的位模式:直接二进制(给出正数)或带符号二进制(给出负数)。 任何 表示负数的位模式也可以解释为正数,只要不使用您使用的任何负数规则即可。

这是另一种思考方式。想想“行军”这个词。这是乐队在游行中所做的事情。但是,如果我将第一个字母 March 大写,则表示一年中的第三个月。所以如果我写“March”,注意大写,就是一个月,但是如果我忽略大写,就是动词。

类似地,如果我写 10000101,并且忽略符号的可能性,我会得到 133。
但是如果我注意符号,我得到一个负数。

或者如果我把它解释成一个字符,我可能会得到别的东西!

这里有 5 种可能性:

bit pattern interpreted as gives
10000101 pure binary 133
10000101 sign/magnitude -5
10000101 ones' complement -122
10000101 two's complement -123
10000101 character à

(现在,我承认,在最后一行我不得不作弊,通过使用旧的 MS-DOS 字符集。在 Unicode 中,10000101 不代表一个字符,而在 Windows 字符集中,它是一个字符,它是一个省略号,或者三个点:... .)


现在,您可能担心的一件事是,我们是否正在“不劳而获”,因为位模式可以作为正数或负数执行双重任务。我们是否以某种方式作弊并扩大了范围?答案是,不,我们不是。让我们继续使用 8 位数字。如果我们将 8 位数字视为纯二进制,我们可以覆盖从 0 到 255 的范围(即 00000000 到 11111111)。我们无法表示数字 300,因为它占用了太多的位,我们也无法表示数字 -5,因为我们没有办法表示负数。用 8 位,在纯二进制中,我们只能表示 0 到 255,仅此而已。

如果我们切换到二进制补码,我们可以表示从 -128 到 +127 的任何数字——正好是 256 个不同的数字。我们仍然不能表示 300(正数或负数),因为它的位数仍然太多。但是,现在,我们也不能表示数字 200,因为如果我们尝试表示,它就是 11001000,这就是 -56 的二进制补码位模式。同样,我们不能表示 133(您的原始示例),因为它的位模式是 10000101,这也是一个负数,-123。