我正在if语句中进行一些简单的十六进制比较。
0x7843E0大于0x780000,但是下面的代码不输出任何内容。
if {"780000" <= "7843E0"} {
puts "True!"
}
>>
但是省略尾随的0很好。
if {"780000" <= "7843E"} {
puts "True!"
}
>>> True!
尾随0一定有问题,但我不知道它是什么。有什么想法吗?
答案 0 :(得分:2)
您在expr
命令解析数字的方式上遇到问题。 (Tcl的其余部分对此更为放松。)问题在于:
"780000"
被解释为十进制整数。"7843E0"
被解释为双精度浮点数。 (与1.2e10
进行比较;数字分析器认为它适合相同的模式。)"780000"
被解释为十进制整数。"7843E"
被解释为非数字字符串(回退是因为没有数字解释是合法的)。 <=
运算符将很高兴地比较两个数字(如果它们都是数字),或者比较两个字符串(如果至少有一个参数是非数字的)。 (是的,这的确偶尔会产生奇怪的语义。)此外,他的expr
命令渴望将值尽可能地解释为数字,但是它仍然具有Tcl的语法规则,即什么是数字以及什么类型的数字化的东西。如果您不遵守规则,就会有些奇怪。
要获取一个解释为十六进制的值,您必须在其字符串表示形式前加上0x
(例如0x7843E0
)或使用诸如{ {1}}和scan
:
%x
用scan "780000" %x a
scan "7843E0" %x b
if {$a <= $b} {
puts "True"
}
强制解释被认为是处理此问题的最佳方法之一,因为它仅将规范值写入变量。 (如果您一直想处理八进制数字,或者一直想一直都是十进制,则分别使用scan
和%o
; %d
用于浮点数。 )
最后,如果您真的要使用类似ASCII的常规规则将值作为字符串进行比较,请查看%f
而不是直接使用string compare
。
<=