Python ctypes.c_int32 - 转换为TCL

时间:2014-05-06 00:00:42

标签: python tcl ctypes

不确定这个的最佳头衔......

无论如何,我试图将一些Python代码转换为TCL并在Python中使用以下代码段:

ctypes.c_int32(x << c).value

返回:-293412352

我在TCL中将其写成一个简单的expr:

expr {$x << $c}

但这会返回:162915344896

在这两种情况下,x = 1272776132c = 7

有没有办法格式化或转换TCL值,因此它的表示方式与Python值相同?

2 个答案:

答案 0 :(得分:0)

您遇到的问题是位宽问题。要保存TCL表达式的输出,需要64位整数,而不是32位整数。

# Wrong
In [7]: C.c_int32(x<<c)
Out[7]: c_int(-293412352)

# Correct
In [9]: C.c_int64(x<<c)
Out[9]: c_long(162915344896)

答案 1 :(得分:0)

这取决于您想要做什么,而这又取决于算法的更广泛的背景。 Tcl使用基于bignums的整数模型(即使它通常使用较小的类型来实现),这意味着我们需要重新解释该值。

binary scan [binary format i [expr {$x << $c}]] i theResult
# theResult = -293412352

但是,如果您只想屏蔽这些位并且不想更改标志,请执行以下操作:

set theResult [expr {($x << $c) & 0xffffffff}]
# theResult = 4001554944

(在64位平台上使用Tcl 8.5和Tcl 8.6检查所有结果,但32位平台上的任何变体都将被视为严重错误; Tcl在其中非常谨慎用于创建数字错觉的数字代码,除了binary命令(如上所用)和formatscan命令外,没有可用的有限位数,但不在这里有用的方法。)