为什么我系统中的sys.maxsize.bit_length()是63而不是64?
我最近学会了如何查看我的x64架构能处理的最大整数值(超过这个数字,系统就会使用长整型)。现在我在学习位运算符,并在这个网站上了解到,Python中的整数是以二进制补码的方式存储的。
当我输入:
print sys.maxsize.bit_length()
我得到了63位。我认为这和我的机器架构有关(Ubuntu 64位)。现在我有几个问题:
- 第64位在哪里?
- 在二进制补码表示法中,它是前面的0还是1?
- 为什么不包括在位数之内?
补充:
- 为什么负数需要64位而不是63位?
1 个回答
4
因为在你的平台上,值是从一个有符号整数得来的。最大值可以用63位来表示,留出第64位用来表示负值。
需要注意的是,int.bit_length()
这个方法会告诉你表示特定整数所需的最少位数,并且不会计算前面的零。它并没有说明底层的C语言整数是什么样的:
>>> 1 .bit_length()
1
>>> 2 .bit_length()
2
>>> 3 .bit_length()
2
>>> 4 .bit_length()
3
返回表示一个整数所需的二进制位数,不包括符号位和前导零
sys.maxsize
通常反映了一个ssize_t
C语言整数能容纳的最大值,但它给你的是一个Python的int
对象。C语言类型可能使用补码表示,这对Python类型来说并不重要。
源代码只是将一个C常量转换为int
对象,这个常量在pyport.h
中定义,因此这个值的来源是依赖于平台的。在Linux上,这个值会是:
typedef ssize_t Py_ssize_t;
/* ... */
#define PY_SSIZE_T_MAX ((Py_ssize_t)(((size_t)-1)>>1))
显然,这个值必须使用补码有符号数表示法,这样最后的部分才能正常工作;值-1
向右移动一位,得到最大的可能值;在补码中,-1表示为全1位,向右移动后得到的是0和全1。
在补码编码系统中,最左边的位(最高位)表示符号,所以在一个64位的数字中,只有其他63位用来表示整数值。