python的小坑:%u

python的小坑:%u

最近在开发过程中,有一小处代码需要将一个无符号32位整数转成字符串,于是想当然地按照C格式化的方法,采用了类似写法:

print "a=%u"%-1

本来预期是输出内容为:

a=4294967295

实际结果并没有转化为无符号整数,仍然采用了有符号整数方式:

a=-1

作为一名C/C++程序员,对这个结果自然感到惊讶。很显然,python把%u和%d等同起来了。于是搜了一下python的文档,在字符串格式化章节中有这样的描述:

%u Obsolete type – it is identical to 'd'.

根据这文档中的内容,又进一步找到了PEP-0237,其中又强调了这点:

this means that '%u' becomes an alias for '%d'.  It will eventually be removed.

虽然不是很理解为什么采取这种做法,但是很明显,在python代码中不应该再使用%u了,这个格式转换完全等同于%d,而且在后续的版本中有可能会被删除掉。

在空闲之余,又挖了一下python的代码,的确也反应了上述各项说明:

  • PyString_Format 函数中,’iduoxX’都按照 PyInt 处理;
  • 接着在 formatint 函数中,明确进行以下转换:
  • if (x < 0 && type == 'u') { 
        type = 'd'; 
    }
Comments are closed.