【问题标题】:Why sys.maxsize.bit_length() is 63 and not 64 on my system?为什么 sys.maxsize.bit_length() 在我的系统上是 63 而不是 64?
【发布时间】:2014-08-13 15:26:19
【问题描述】:

我最近学会了如何查看我的 x64 架构可以处理的最大整数 int()。 (超过这个数字,系统使用long)。 现在我正在研究按位运算符,并在这个网站上了解到 Python 中的整数存储在二进制补码系统中。

当我输入时:

print sys.maxsize.bit_length()

我得到 63 位。我认为这取决于我的机器架构(Ubuntu 64 位)。 问题是:

  • 第 64 位在哪里?
  • 是二进制补码符号中的前导 0 还是 1?
  • 为什么不包含在位长中?

添加:

  • 为什么我们需要 64 位而不是 63 位的负数?

【问题讨论】:

    标签: python theory bit twos-complement


    【解决方案1】:

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

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

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

    来自int.bit_length() documentation

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

    sys.maxsize 通常反映了 ssize_t C integer 可以容纳的最大值,但它会为您提供 Python int 对象。 C 类型 可能使用二进制补码这一事实与 Python 类型无关。

    源代码只是converts a C constant to a int object,常量在pyport.h 中定义,因此该值的派生方式取决于平台。对于 Linux,这将是:

    typedef ssize_t         Py_ssize_t;
    /* ... */
    #define PY_SSIZE_T_MAX ((Py_ssize_t)(((size_t)-1)>>1))
    

    显然,该值必须使用two's complement signed number representation 才能使最后一部分起作用;值-1 向右移动一位以达到最大可能值;在 二的补码中 -1 表示为全 1 位,将它们向右移动会得到一个 0 和全 1。

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

    【讨论】:

    • 为什么 64 是负值?我想了解这个
    • @PatrickRoncagliolo:我之所以提到它,是因为sys.maxsize 是由 C 类型 ssize_t 可以容纳的最大值确定的。 that 类型是一个单数 C 整数;它使用什么格式并不重要,但通常它会使用两个恭维。 这对于 Python int 对象类型无关紧要
    • 那么为什么 63 而不是 64 表示正值,而计算机使用 64 位表示负值?
    • @PatrickRoncagliolo:绝对清楚:对于 Python 整数,这一切都无关紧要;底层解释器如何存储这些根本不重要。 sys.maxsize 恰好反映了一个系统值,但您真的不需要关心任何给定的 Python int 对象使用了多少位。 int.bit_size() 值并没有反映这一点,它只计算实际使用的位,而不是可以存储多少
    • @PatrickRoncagliolo:完全正确; Python 没有给你前导 0 位的原因是因为 Python 不一定使用有符号的 C 整数来存储这些。在 Python 3 中,所有整数,在 Python 2 中,long 整数存储为 C 无符号整数数组,其符号存储在其他位置。此存储可以容纳的最大位数仅受您的内存限制。
    猜你喜欢
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多