或者我猜二进制一般。我对编码显然很陌生,所以我很感激这里的任何帮助。
我刚刚开始学习如何将数字转换为二进制数,特别是二进制数。该课程提供了以下转换代码:
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的方法?
对那一个的后续行动,&#39;签署数量&#39;上述答案中提到的格式不同于两个补码?
教授根本没有谈论8位,16位,64位等等,我在阅读这篇文章时看到了很多。这种区别来自哪里,Python使用哪一个?或者那些我可能编码的程序特定的名称?
很多这些帖子我只引用了Python存储整数的方式。这是否表明它以不同的方式存储浮动,或者它们只是广泛地说话?
当我写下这一切时,我有点意识到也许我在学习如何游泳之前潜入深渊,但我很好奇,并希望对事物有更深入的了解继续前进。
答案 0 :(得分:2)
我认为代码建议只是在二进制数的前面添加一个 - 以显示其负面对应物是完全错误的。它看起来像bin()做同样的事情,但你不必翻转位并添加1或其他东西?除了让它易于理解/阅读之外,还有其他原因吗?
你必须以某种方式指定数字为负数。您可以添加另一个符号(-
),在开头添加一个符号位,使用一个补码,使用二进制补码,或其他一些有效的完全组合方案。数字的二进制和二进制表示都需要固定数量的位,而Python整数则不存在这些位:
>>> 2**1000
1071508607186267320948425049060001810561404811705533607443750
3883703510511249361224931983788156958581275946729175531468251
8714528569231404359845775746985748039345677748242309854210746
0506237114187795418215304647498358194126739876755916554394607
7062914571196477686542167660429831652624386837205668069376
自然的解决方案是只加一个减号。您可以类似地编写自己的bin()
版本,要求您指定位数并返回数字的二进制补码表示。
正在阅读这里,其中一个答案特别说Python并没有真正起到两个补码的作用,而是模仿它的其他东西。对我来说,这里的脱节是Python向我展示了一件事,但是以不同的方式存储数字。同样,这只是为了易用吗? bin()是使用二进制补码还是Python的方法?
Python是一种高级语言,因此您并不真正了解(或关心)特定Python运行时如何存储整数。无论您使用CPython,Jython,PyPy,IronPython还是其他东西,语言规范只定义它们应该如何表现,而不是如何在内存中表示它们。 bin()
只需要一个数字并使用二进制数字打印出来,就像将123
转换为base-2一样。
对于那个问题的后续行动,上述答案中提到的“符号幅度”格式与两个补码的不同之处是什么?
符号幅度通常将n
编号为0bXYYYYYY...
,其中X
是符号位,YY...
是非负幅度的二进制数字。编码为二进制补码的算术由于表示而更加优雅,而符号幅度编码则需要对符号相反的数字进行特殊处理。
教授根本没有谈论8位,16位,64位等等,我在阅读这篇文章时看到了很多。这种区别来自哪里,Python使用哪一个?或者那些特定于我可能正在编码的程序的名称?
不,Python没有为其整数定义最大大小,因为它不是那么低级。如果您有足够的内存,2**1000000
计算正常,2**10000000
也会计算。当您的硬件使您的数字变得更加有利时,会出现 n 位数。例如,处理器具有快速使用32位数字但不能使用87位数字的指令。
很多这些帖子我只引用了Python如何存储整数。这是否暗示它以不同的方式存储浮动,或者它们只是广泛地说话?
这取决于Python运行时使用的内容。通常浮点数类似于C double
s,但这不是必需的。
答案 1 :(得分:1)
你不必翻转这些位并添加1或其他东西吗?
是的,对于两个补码表示法,您将所有位反转并添加一个以获得负对齐。
bin()是使用二进制补码还是Python方法?
二进制补码是一种实用的方法来表示电子中只有0和1的负数。在内部,微处理器使用二进制补码表示负数,所有现代微处理器都可以。有关详细信息,请参阅有关计算机体系结构的教科书。
上述答案中提到的'符号幅度'格式如何? 不同于两个补充?
您应该查看此代码的作用以及它存在的原因:
while num > 0:
result = str(num % 2) + result
num = num // 2