x64汇编:将用户输入字符串转为整数以实现数值比较
解决数字字符串的正确数值比较问题
哈哈,这个字符串比数字的坑我刚入行的时候也踩过!你一开始直接用字符串比较的思路完全没问题,但忽略了字符串比较的本质——它是按单个字符的ASCII值逐位对比的,根本不管你输入的是数字还是啥。就像你说的,输入N1:0000001和N2:20的时候,字符串比较会先看第一个字符:'0'的ASCII码是48,'2'是50?不对哦,等等你说判定N1更大?哦可能你是不是代码里的比较逻辑写反了?不管怎样,核心问题就是字符串比较不理解"数字数值"的概念,只认字符顺序。
所以同事说的转成序数(数值类型)的思路绝对是正解。
看你贴的这段汇编代码片段:
r10 = length of inp1 xor rcx, rcx ord: cmp r10, rcx ;compare length against counter je error ;j...
这段看起来是在做数值转换前的长度校验或者字符遍历准备?比如先拿到输入字符串的长度,初始化计数器rcx,然后循环遍历每个字符进行转换,一旦长度和计数器相等就跳转到错误分支——应该是用来处理空输入或者遍历完成后的异常情况?
给你几个实操的补充建议:
- 转换数值时记得处理前导零,把
"0000001"这类字符串转成整数1,这样和20比较就能得到正确的结果 - 转换过程中要加非数字字符的校验,比如用户输入了字母或者符号,直接触发你代码里的
error分支,避免转换出错 - 如果要处理超大数字(超出普通整数类型范围的那种),可以先去掉两个字符串的前导零,对齐长度后再从高位到低位逐位比较字符大小,这种方法不用转成数值,也能得到正确的数值比较结果
最后再理一遍正确的流程:
- 接收用户输入的两个数字字符串
- 对每个字符串做预处理(去前导零、校验合法字符)
- 转成数值类型(或用大数比较逻辑)
- 进行数值比较,输出正确的结果
内容的提问来源于stack exchange,提问作者user93938
相关产品推荐
相关产品推荐

