ASCII 码表(0–127)
大写字母在前,码值更小:A–Z = 65–90,之后是 a–z = 97–122,小写整体比大写大 32。 两者之间(91–96)夹着 6 个符号:
[、\、]、^、_、`(反引号)。
1. 完整码表
行列都是十六进制:码值 = 行 × 16 + 列。
| 高位 \ 低位 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0x0 | NUL | SOH | STX | ETX | EOT | ENQ | ACK | BEL | BS | HT | LF | VT | FF | CR | SO | SI |
| 0x1 | DLE | DC1 | DC2 | DC3 | DC4 | NAK | SYN | ETB | CAN | EM | SUB | ESC | FS | GS | RS | US |
| 0x2 | 空格 | ! | " | # | $ | % | & | ' | ( | ) | * | + | , | - | . | / |
| 0x3 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
| 0x4 | @ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
| 0x5 | P | Q | R | S | T | U | V | W | X | Y | Z | [ | \ | ] | ^ | _ |
| 0x6 | ` | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o |
| 0x7 | p | q | r | s | t | u | v | w | x | y | z | { | | | } | ~ | DEL |
举例:A 在 0x4 行第 1 列 → 4×16+1 = 65;a 在 0x6 行第 1 列 → 6×16+1 = 97。
2. 大小写字母对照
| 大写 | 码值 | 小写 | 码值 | 大写 | 码值 | 小写 | 码值 | |
|---|---|---|---|---|---|---|---|---|
| A | 65 | a | 97 | N | 78 | n | 110 | |
| B | 66 | b | 98 | O | 79 | o | 111 | |
| C | 67 | c | 99 | P | 80 | p | 112 | |
| D | 68 | d | 100 | Q | 81 | q | 113 | |
| E | 69 | e | 101 | R | 82 | r | 114 | |
| F | 70 | f | 102 | S | 83 | s | 115 | |
| G | 71 | g | 103 | T | 84 | t | 116 | |
| H | 72 | h | 104 | U | 85 | u | 117 | |
| I | 73 | i | 105 | V | 86 | v | 118 | |
| J | 74 | j | 106 | W | 87 | w | 119 | |
| K | 75 | k | 107 | X | 88 | x | 120 | |
| L | 76 | l | 108 | Y | 89 | y | 121 | |
| M | 77 | m | 109 | Z | 90 | z | 122 |
每一对差值恒为 32:a - A = 32,b - B = 32 …… z - Z = 32。
3. 常用速查
| 字符 | 码值 | 字符 | 码值 |
|---|---|---|---|
'0' | 48 | '9' | 57 |
'A' | 65 | 'Z' | 90 |
'a' | 97 | 'z' | 122 |
| 空格 | 32 | 'a' - 'A' | 32 |
补充:数字 0–9 的码值是连续的 48–57,所以 '7' - '0' 直接得到数值 7。
4. C/C++ 里的用法
char c = 'm';
// 判断小写(下界小、上界大,别写反)
if (c >= 'a' && c <= 'z') { /* ... */ }
// 判断大写
if (c >= 'A' && c <= 'Z') { /* ... */ }
// 小写 -> 大写
if (c >= 'a' && c <= 'z') c -= 32;
// 大写 -> 小写
if (c >= 'A' && c <= 'Z') c += 32;
// 字符数字转真正的数字
int d = '7' - '0'; // d == 7
也可以用 <cctype> 里的现成函数:
#include <cctype>
islower(c); isupper(c); isdigit(c);
toupper(c); tolower(c);
5. 两个常见错误
错误一:区间写反
if (c >= 'z' && c <= 'a') // 恒假
等价于 c >= 122 && c <= 97,要求一个数同时大于 122 又小于 97,永远不成立。
正确写法是 c >= 'a' && c <= 'z',等价于 97 <= c <= 122。
错误二:把 sizeof 当成字符串长度
for (int p = 1; p < sizeof(m); p++) // 错,sizeof(string) 恒为 32
for (int p = 1; p < m.size(); p++) // 对
sizeof 是编译期运算符,算的是类型占多少字节,与内容无关;std::string 的长度要用 m.size()。
相关笔记:数组(一维与二维)