Trong C, kiểu char bản chất là số nguyên nhỏ (thường 8-bit). Khi thực hiện phép toán, char tự động chuyển thành int (integer promotion) theo mã ASCII.
Ví dụ minh họa
#include <stdio.h>
int main() {
char s = 'm'; // ASCII 109
char t = 'z' - 'y'; // 122 - 121 = 1
printf("s = %d (char: %c)\n", s, s); // 109, m
printf("s+1 = %d (char: %c)\n", s+1, s+1); // 110, n
printf("s-1 = %d (char: %c)\n", s-1, s-1); // 108, l
printf("t = %d\n", t); // 1
// In ký tự từ số
printf("65 = %c, 97 = %c\n", 65, 97); // A, a
return 0;
}
Kết quả
s = 109 (char: m) s+1 = 110 (char: n) s-1 = 108 (char: l) t = 1 65 = A, 97 = a
Ứng dụng thực tế
1. Chuyển đổi chữ hoa/thường (ASCII)
char lower = 'A' + 32; // 'a' (65+32=97) char upper = 'z' - 32; // 'Z' (122-32=90) // An toàn hơn: dùng ctype.h #includechar c = 'A'; char lower = tolower(c); // 'a' char upper = toupper(c); // 'A'
2. Chuyển chữ số ký tự sang giá trị số
char digit = '7';
int value = digit - '0'; // 7
// Parse số từ chuỗi
int parseInt(const char* str) {
int result = 0;
while (*str >= '0' && *str <= '9') {
result = result * 10 + (*str - '0');
str++;
}
return result;
}
3. Caesar Cipher (Dịch chuyển ký tự)
char caesar(char c, int shift) {
if (c >= 'a' && c <= 'z') {
return 'a' + (c - 'a' + shift) % 26;
}
if (c >= 'A' && c <= 'Z') {
return 'A' + (c - 'A' + shift) % 26;
}
return c;
}
// caesar('a', 3) = 'd', caesar('z', 1) = 'a'
4. Kiểm tra ký tự
bool isDigit(char c) { return c >= '0' && c <= '9'; }
bool isUpper(char c) { return c >= 'A' && c <= 'Z'; }
bool isLower(char c) { return c >= 'a' && c <= 'z'; }
bool isAlpha(char c) { return isUpper(c) || isLower(c); }
// Hoặc dùng ctype.h: isdigit, isalpha, isupper, islower
Lưu ý quan trọng
charcó thể signed (-128..127) hoặc unsigned (0..255) tùy implementation- Khi làm toán học, char được promote thành
int - Kết quả gán lại vào char có thể bị truncate/overflow
- Chỉ an toàn với ASCII. Unicode/UTF-8: một ký tự ≠ một char
- Dùng
<ctype.h>functions cho portable code
Bảng ASCII tham chiếu
'0'..'9' : 48..57 'A'..'Z' : 65..90 'a'..'z' : 97..122 ' ' (space) : 32 '\n' (newline) : 10 '\t' (tab) : 9