comparison - 我是否正确比较了 tcl 中的十六进制值?
问题描述
我在 if 语句中做一些简单的十六进制比较。
0x7843E0 大于 0x780000 但下面的代码不输出任何内容。
if {"780000" <= "7843E0"} {
puts "True!"
}
>>
但是,省略尾随 0 可以正常工作。
if {"780000" <= "7843E"} {
puts "True!"
}
>>> True!
后面的 0 一定有问题,但我不明白它是什么。有任何想法吗?
解决方案
您在expr
命令解析数字的方式上遇到问题。(Tcl 的其余部分对此更加放松。)问题是:
"780000"
被解释为十进制整数。"7843E0"
被解释为双精度浮点数。(比较1.2e10
; 数字解析器认为它适合相同的模式。)"780000"
被解释为十进制整数。"7843E"
被解释为非数字字符串(回退,因为没有数字解释是合法的)。
如果<=
两个数字都是数字,则操作员会很高兴地比较两个数字,如果至少有一个参数是非数字的,则操作员会很乐意比较两个字符串。(是的,这确实偶尔会产生奇怪的语义。)此外,expr
如果可能的话,他的命令渴望将值解释为数字,但它仍然具有 Tcl 的语法规则,用于说明什么是数字,以及这些东西是什么类型的数字。当你不遵守规则时,它会变得有点奇怪。
要获得解释为十六进制的值,您必须在其字符串表示前面加上0x
(例如, 0x7843E0
)或使用命令强制执行操作,例如scan
with %x
:
scan "780000" %x a
scan "7843E0" %x b
if {$a <= $b} {
puts "True"
}
强制解释scan
被认为是处理此问题的最佳方法之一,因为它只会将规范值写入变量。(如果您一直想要处理八进制数,或者想要真正始终是十进制数,您可以分别使用%o
和%d
;%f
用于浮点数。)
最后,如果您真的将值作为字符串与普通的类似 ASCII 的规则进行比较,请查看string compare
而不是<=
直接使用。
if {[string compare $input1 $input2] <= 0} {
...
}
推荐阅读
- codeigniter-4 - 错误异常 - 未定义变量:CodeIgniter4 中的会话
- image - 如何从 Multi Image Picker 保存图像,在 Flutter 中保留其原始元数据/exif 内容?
- typescript - 复杂的泛型类型约束和类型推断
- c++ - 我认为这个开放的 gl 代码导致内存泄漏,我犯了什么错误?
- mysql - 如何让 MySQL 中的 JSON 数据过滤和排序更快?
- laravel - 如何确保 saveImage() 在不同的环境中工作(使用 spatie/pdf-to-image)?
- javascript - 禁用表格中的单选按钮行
- java - proguard: java.lang.NoSuchFieldError 用于访问超类中定义的字段
- javascript - 如何使用 sequelize model.findAll() 获取表的最大值
- django - DJANGO DEBUG=FALSE 自定义错误页面 (ConnectionAbortedError)