不确定这个的最佳头衔......
无论如何,我试图将一些Python代码转换为TCL并在Python中使用以下代码段:
ctypes.c_int32(x << c).value
返回:-293412352
我在TCL中将其写成一个简单的expr:
expr {$x << $c}
但这会返回:162915344896
在这两种情况下,x = 1272776132
和c = 7
有没有办法格式化或转换TCL值,因此它的表示方式与Python值相同?
答案 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
命令(如上所用)和format
和scan
命令外,没有可用的有限位数,但不在这里有用的方法。)