赖勇浩(http://laiyonghao.com) 问题1
在较新版本的 Python 中,当两个 int 相加溢出时,它会自动把把结果转换到 long 类型,比如:
>>> 0x7FFFFFFF + 12147483648L这个特性很好,但是它跟 C 语言的结果不一样。如果你要把结果 pack 到 4 个字节的 buffer 中发送到别的进程,结果就比较纠结:
>>> import struct>>> struct.pack("i", 0x7FFFFFFF + 1)Traceback (most recent call last):File "<stdin>", line 1, in <module>struct.error: long too large to convert to int我在设计我的 webgame 网络协议时遇到了这个问题。 问题2
在不同的硬件平台,同一个函数的返回值也可能是不一样的,比如 hash(),在 32-bit 和 64-bit 都是返回 int,但大小却大有不同:
>>> hash('copyright' * 10) # 32-bit platform-942199392>>> hash('copyright' * 10) # 64-bit platform-6555514777893392992想像一下你在 32-bit 下写了一个 k/v 存储的文件放到 64-bit 去读,或者反过来,是不是让你很抓狂? 问题3
在不同的 python 版本里,不少函数的返回值也是不一样的,举个例子,zlib 里的 crc32 函数,嗯,是的,别以为它以 32 结尾就一致了!以下引用自 python manuals:
Changed in version 2.6: The return value is in the range [-2**31, 2**31-1] regardless of platform. In older versions the value is signed on some platforms and unsigned on others.
Changed in version 3.0: The return value is unsigned and in the range [0, 2**32-1] regardless of platform.