我是否可以正确比较tcl中的十六进制值?

时间:2019-03-24 21:50:57

标签: comparison tcl

我正在if语句中进行一些简单的十六进制比较。

0x7843E0大于0x780000,但是下面的代码不输出任何内容。

if {"780000" <= "7843E0"} {
    puts "True!"
}
>>

但是省略尾随的0很好。

if {"780000" <= "7843E"} {
    puts "True!"
}
>>> True!

尾随0一定有问题,但我不知道它是什么。有什么想法吗?

1 个答案:

答案 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

<=