Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么在我的系统上sys.maxsize.bit_length()是63而不是64?_Python_Theory_Bit_Twos Complement - Fatal编程技术网

Python 为什么在我的系统上sys.maxsize.bit_length()是63而不是64?

Python 为什么在我的系统上sys.maxsize.bit_length()是63而不是64?,python,theory,bit,twos-complement,Python,Theory,Bit,Twos Complement,我最近学习了如何查看x64 arch可以处理的最大整数int()。(高于此数字时,系统使用长)。 现在我正在学习位运算符,并在这个网站上了解到Python中的整数存储在2的补码系统中 当我打字时: print sys.maxsize.bit_length() 我得到63位。我认为这取决于我的机器(Ubuntu 64位)。 问题是: 位n°64在哪里 它是两个补码符号中的前导0还是1 为什么不包括在位长度中 增加: 为什么负数需要64位而不是63位 因为在您的平台上,该值是从有符号整数派生

我最近学习了如何查看x64 arch可以处理的最大整数int()。(高于此数字时,系统使用长)。 现在我正在学习位运算符,并在这个网站上了解到Python中的整数存储在2的补码系统中

当我打字时:

print sys.maxsize.bit_length()
我得到63位。我认为这取决于我的机器(Ubuntu 64位)。 问题是:

  • 位n°64在哪里
  • 它是两个补码符号中的前导0还是1
  • 为什么不包括在位长度中
增加:

  • 为什么负数需要64位而不是63位

因为在您的平台上,该值是从有符号整数派生的。最大值为63位,第64位为负值

请注意,
int.bit_length()
方法提供表示该特定整数所需的最小位数,并且不包括前导零。它没有说明任何关于底层C整数的内容:

>>> 1 .bit_length()
1
>>> 2 .bit_length()
2
>>> 3 .bit_length()
2
>>> 4 .bit_length()
3
从:

返回表示二进制整数所需的位数,不包括符号和前导零

sys.maxsize
通常反映a可以容纳的最大值,但它会为您提供一个Python
int
对象。C类型可能使用2的补码这一事实对Python类型来说几乎不重要

该常量仅在源代码中定义,因此该值的推导方式取决于平台。对于Linux,这将是:

typedef ssize\u t Py\u ssize\t;
/* ... */
#定义PY_-SSIZE_-T_-MAX((PY_-SSIZE-T)((size-T)-1)>>1))
显然,该值必须使用a才能使最后一部分正常工作;值
-1
向右移位一位,以获得最大可能值;在2中,补码-1表示为所有1位,将这些位向右移动将得到0和所有1


在两位补码编码系统中,符号的编码是最高有效位(最左边),因此在64位数字中,只剩下其他63位来编码整数值。

因为在您的平台上,值是从有符号整数派生的。最大值为63位,第64位为负值

请注意,
int.bit_length()
方法提供表示该特定整数所需的最小位数,并且不包括前导零。它没有说明任何关于底层C整数的内容:

>>> 1 .bit_length()
1
>>> 2 .bit_length()
2
>>> 3 .bit_length()
2
>>> 4 .bit_length()
3
从:

返回表示二进制整数所需的位数,不包括符号和前导零

sys.maxsize
通常反映a可以容纳的最大值,但它会为您提供一个Python
int
对象。C类型可能使用2的补码这一事实对Python类型来说几乎不重要

该常量仅在源代码中定义,因此该值的推导方式取决于平台。对于Linux,这将是:

typedef ssize\u t Py\u ssize\t;
/* ... */
#定义PY_-SSIZE_-T_-MAX((PY_-SSIZE-T)((size-T)-1)>>1))
显然,该值必须使用a才能使最后一部分正常工作;值
-1
向右移位一位,以获得最大可能值;在2中,补码-1表示为所有1位,将这些位向右移动将得到0和所有1


在二者的补码编码系统中,对符号进行编码的是最高有效位(最左边),因此在64位数字中,只剩下其他63位对整数值进行编码。

为什么64表示负值?我想了解this@PatrickRoncagliolo:我之所以提到它,是因为
sys.maxsize
是由C类型
ssize\t
可以容纳的最大值决定的。它是一个单一的C整数类型;它使用什么格式并不重要,但通常会使用两个“恭维”。这对于Python
int
对象类型来说无关紧要。那么为什么63而不是64表示正值,而计算机使用64位表示负值呢?@PatrickRoncagliolo:而且非常清楚:对于Python整数,这一切都无关紧要;底层解释器如何存储这些并不重要
sys.maxsize
恰好反映了一个系统值,但是您真的不需要关心任何给定Python
int
对象使用了多少位。
int.bit\u size()
值并不反映这一点,它只计算实际使用的位,而不计算可以存储多少位。@PatrickRoncagliolo:正是;Python不给你前导0位的原因是因为Python不一定使用有符号的C整数来存储这些。在Python3和Python2中,所有整数都存储为C无符号整数数组,其符号存储在别处。此存储器可容纳的最大位数仅受内存限制。为什么负值为64?我想了解this@PatrickRoncagliolo:我之所以提到它,是因为
sys.maxsize
是由C类型
ssize\t
可以容纳的最大值决定的。它是一个单一的C整数类型;它使用什么格式并不重要,但通常会使用两个“恭维”。这对于Python
int
对象类型来说无关紧要。那么为什么63而不是64表示正值,而计算机使用64位表示负值呢?@PatrickRoncagliolo:而且非常清楚:对于Python整数,这一切都无关紧要;底层解释器如何存储这些并不重要
sys.maxsize
恰好反映了一个系统值,但是您真的不需要关心任何给定Python
int
对象使用了多少位。
int.bit\u size()
值并不反映这一点,它只计算实际使用的位,而不计算可以存储多少位。@PatrickRoncagliolo:正是;原因是什么