IJVM两位数字求和输出问题:如何输出数字而非ASCII字符
解决IJVM输出数字"5"而非字符"e"的问题
嘿,这个坑我当初刚学IJVM的时候也踩过!问题的核心在于你现在操作的是ASCII字符的数值,而不是数字本身,再加上OUT指令的特性——它会把栈顶的数值直接当作ASCII码来输出对应的字符。
为什么当前代码输出"e"?
你现在push的0x32是字符'2'的ASCII值,0x33是字符'3'的ASCII值,两者相加得到0x32 + 0x33 = 0x65,而0x65正好是字符'e'的ASCII码,所以OUT指令自然输出了"e"。
两种解决方案
要输出数字"5",你需要先把计算结果转换成数字字符对应的ASCII码(数字0-9的ASCII码是0x30到0x39,所以数字n对应的ASCII码是n + 0x30)。
方案1:先将ASCII字符转成数字,计算后再转回ASCII
BIPUSH 0x32 // 压入字符'2'的ASCII值 BIPUSH 0x30 // 压入字符'0'的ASCII值 ISUB // 转成数字2:0x32 - 0x30 = 2 BIPUSH 0x33 // 压入字符'3'的ASCII值 BIPUSH 0x30 // 压入字符'0'的ASCII值 ISUB // 转成数字3:0x33 - 0x30 = 3 IADD // 计算2+3=5 BIPUSH 0x30 // 转成字符'5'的ASCII值:5 + 0x30 = 0x35 IADD OUT // 输出"5"
方案2:直接操作数字,计算后转ASCII
如果一开始就不需要处理ASCII字符,直接push数字本身会更简洁:
BIPUSH 2 // 直接压入数字2 BIPUSH 3 // 直接压入数字3 IADD // 计算2+3=5 BIPUSH 0x30 // 转成字符'5'的ASCII值 IADD OUT // 输出"5"
关键知识点
OUT指令的行为:它总是把栈顶的16位数值当作ASCII码,输出对应的字符。- 数字与ASCII字符的转换规则:对于0-9的数字,
数字值 + 0x30 = 对应字符的ASCII值,反之ASCII值 - 0x30 = 数字值。
内容的提问来源于stack exchange,提问作者SmOg3R
相关产品推荐
相关产品推荐

