进制转换与二进制补码

您的数据

开头的 0b、0o 或 0x 会被接受并忽略,数字之间的空格和下划线也是。

结果

按你选的读法,这些比特值多少

同样这串比特,换个读法
二进制
十六进制
八进制
这个位宽装得下的全部范围

取负,一步一步来

从这串比特开始
把每一位都取反
再加一,这就是负数
也就是

取反再加一,等同于用二的位宽次方去减,这在八位的全部二百五十六种组合上都验证过。做两次总会回到出发点,正是这个性质让整套方案成立。

本页用的是任意大小的整数,而不是通常的浮点数,因为大约从九千万亿往上,普通的浮点类型就开始跳过某些值:二的五十三次方加一,出来还是二的五十三次方。在六十四位上,那会悄无声息地给出错误答案。

反应

0

0 评论

User profile image

成为第一个发表评论的人

为什么 200 会变成负 56?

因为 200 和负 56 是同样的八个比特:11001000。这些比特里没有任何东西说明你指的是哪一个。位宽和读法是在别处决定的,由写程序的人决定,而这串比特对两种答案都成立。

全部差别就在最左边那一位。只要它是 0,两种读法就完全一致——这正是为什么这个分歧一直看不见,直到某个值越过一半。

为什么范围是负 128 到 127,而不是负 127 到 127?

因为零总得占个位置,而它占在正数那边。八个比特有 256 种不同的组合,其中一种给了零,剩下 255 种要分。分下来是 127 个正数和 128 个负数,所以负数那边多一个。

每种位宽都一样:16 位是负 32768 到 32767,64 位是负 9223372036854775808 到 9223372036854775807。

有没有哪个数没有相反数?

有,每种位宽正好一个:最小的那个负数。八位里的负 128 没有正数孪生兄弟,因为 128 需要一个正数那边没有的位置。

把 10000000 的每一位取反,得到 01111111;再加一,就回到了 10000000。对它取负,还给你同一个数。本页把这件事显示出来而不是藏起来,这个性质在 8、16、32 和 64 位上都验证过。

数字放不下时会怎样?

它会绕回来,而本页选择显示绕回的结果,而不是拒绝。把 300 写进八位存下的是 44,把负 129 写进去存下的是 127。

这不是页面在放水,而是硬件本来就这么干。显示一个错误,反而会把你多半正是来搞懂的那个问题的成因给藏起来。