进制转换与二进制补码
您的数据
开头的 0b、0o 或 0x 会被接受并忽略,数字之间的空格和下划线也是。
结果
按你选的读法,这些比特值多少
—
| 同样这串比特,换个读法 | — |
| 二进制 | — |
| 十六进制 | — |
| 八进制 | — |
| 这个位宽装得下的全部范围 | — |
取负,一步一步来
| 从这串比特开始 | — |
| 把每一位都取反 | — |
| 再加一,这就是负数 | — |
| 也就是 | — |
取反再加一,等同于用二的位宽次方去减,这在八位的全部二百五十六种组合上都验证过。做两次总会回到出发点,正是这个性质让整套方案成立。
本页用的是任意大小的整数,而不是通常的浮点数,因为大约从九千万亿往上,普通的浮点类型就开始跳过某些值:二的五十三次方加一,出来还是二的五十三次方。在六十四位上,那会悄无声息地给出错误答案。
为什么 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。
这不是页面在放水,而是硬件本来就这么干。显示一个错误,反而会把你多半正是来搞懂的那个问题的成因给藏起来。
反应
0
0 评论
成为第一个发表评论的人