我们都知道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

汇编的魅力莫过于此,一切尽在不言中。