我们都知道a的ASCII码是0x61,而A的ASC码是0x41,而英文字母只有26个,为什么要在中间差出0x20,即32呢。
实际上,这一点在16进制下可能不那么好理解,我一直认为没有绝对不能理解或解决的问题,只有在当前层面不能理解或解决的问题,所以让我们继续深入到计算机最底层的二进制看看a和A的二进制。
A:0100 0001
a:0110 0001
我们看到小写和大写的A只在一位有差别。而这一位的1在10进制中就是32,即2^5.
那为什么要这样做呢。在涉及到字符串的操作时,大小写转换是一件很平常的事,如果在汇编层面能降低大小写转换带来的工作量,那再好不过了。而让所有大小写字母对应相差32则是最好的做法。这样在二进制层面就能让大小写转换只需要改变一位。
而具体操作的实现可以通过或运算和与运算做到。
比如大写转小写,还是拿刚才的A和a举例。
A:0100 0001 a:0110 0001
or:0010 0000 and:1101 1111
a:0110 0001 A:0100 0001
汇编的魅力莫过于此,一切尽在不言中。