【发布时间】:2018-08-18 15:03:14
【问题描述】:
或者我猜一般是二进制的。我显然对编码很陌生,因此我将不胜感激。
我刚开始学习将数字转换为二进制,特别是二进制补码。该课程提供了以下转换代码:
num = 19
if num < 0:
isNeg = True
num = abs(num)
else:
isNeg = False
result = ''
if num == 0:
result = '0'
while num > 0:
result = str(num % 2) + result
num = num // 2
if isNeg:
result = '-' + result
这向我提出了几个问题,在做了一些研究(主要是在 Stack Overflow 上)之后,我发现自己比以前更困惑了。希望有人可以为我分解更多。以下是其中一些问题:
我认为代码建议只在二进制数前面附加一个
-以显示其负数是完全错误的。看起来bin()做了同样的事情,但你不必翻转位并添加一个 1 或其他东西吗?除了使其易于理解/阅读之外,还有其他原因吗?正在阅读 here 和 one of the answers in particular 说 Python 并不能真正用于二进制补码,而是模仿它的其他东西。对我来说,这里的脱节是 Python 向我展示了一件事,但以不同的方式存储数字。再说一遍,这只是为了方便使用吗?
bin()是用二进制补码还是Python的方法?跟进那个,上面答案中提到的“符号-幅度”格式与二进制补码有何不同?
教授根本不谈论 8 位、16 位、64 位等,我在阅读这篇文章时看到了很多。这种区别从何而来,Python 是否使用了一个?或者这些名称是否特定于我可能正在编码的程序?
很多这些帖子我只提到了 Python 如何存储整数。这是暗示它以不同的方式存储浮动,还是只是泛泛而谈?
当我写完这一切时,我有点意识到,也许我在学习如何游泳之前就已经深入到了深处,但我对此很好奇,喜欢在继续前进之前对事物有更深入的了解。
【问题讨论】:
-
bin()不返回二进制位,它返回二进制数的字符串表示形式。 -
Python 不使用固定大小的整数(即 32 位或 64 位)。而且,正如
chrisz所说,bin返回一个字符串,表示 二进制数字系统 中的整数。这与 python 用来表示整数的实际底层位的方式不同。是的,无论如何,Pythonint对象不使用二进制补码。 -
请参阅en.wikipedia.org/wiki/64-bit_computing 了解有关 n 位起源的想法。我记得读过一些 4 位的旧英特尔 CPU 数据表。通常可用的 CPU 寄存器位宽,或由寄存器指定时的内存地址宽度,或数据总线宽度...
-
如果您想知道 int 的实际存储方式(在最新版本的 CPython 中),请查看源代码,特别是
longintrep.h,或者查看superhackyinternals以使用 Python 中的位边。但简短的版本是(IIRC)它是一个尽可能多的 30 位“数字”列表,符号在最高位。 -
同时,Jython 或 IronPython 可能使用完全不同的东西。围绕本机 JVM 或 .NET bigint 类型的包装器可能有意义。或者,它可能使用 30 位“数字”,但它们存储在一个绳索中,该绳索通常是一个用于大量数字的连续数组,但并非总是如此。只要能提供与 CPython 的实现相同的接口和大致相同的性能保证,就是有效的。