char 类型
char 是 "character"(字符)的缩写,它的主要用途是存储单个字符。

(图片来源网络,侵删)
核心特点
- 本质是整数:在 C 语言中,
char类型在底层本质上就是一个小整数,它通常占用 1 个字节(8 bits)的内存空间。 - 字符编码:它存储的是字符在字符编码表(如 ASCII 或 Unicode)中的整数值,在 ASCII 编码中:
'A'的整数值是 65。'a'的整数值是 97。'0'的整数值是 48。'\n'(换行符) 的整数值是 10。
- 三种变体:为了处理有符号和无符号数,以及国际化字符(如中文、日文),
char有三种形式:char: 有符号字符,默认情况下,char是有符号的,这意味着它可以存储 -128 到 127 之间的整数(或 0 到 255,具体取决于编译器实现,但现代编译器大多默认为有符号)。unsigned char: 无符号字符,只能存储 0 到 255 之间的非负整数。signed char: 明确的有符号字符,与char类似,但明确表示是有符号的,保证范围是 -128 到 127。
重要提示:当
char用于存储字符时,它的符号性通常不重要,但当它被用作一个小的整数时,就需要特别注意是signed还是unsigned。
示例代码
#include <stdio.h>
int main() {
// 1. 声明一个 char 变量
char my_char = 'A';
// 2. 使用 %c 打印字符
printf("字符: %c\n", my_char); // 输出: 字符: A
// 3. 使用 %d 打印其底层整数值
printf("ASCII 值: %d\n", my_char); // 输出: ASCII 值: 65
// 4. char 变量可以进行算术运算
char lowercase_char = my_char + 32; // 'A' (65) + 32 = 97 ('a')
printf("转换后: %c\n", lowercase_char); // 输出: 转换后: a
// 5. 使用 unsigned char
unsigned char uc = 255;
printf("无符号 char 的最大值: %u\n", uc); // 输出: 无符号 char 的最大值: 255
return 0;
}
long 类型
long 是 "long"(长的)的缩写,用于表示整数,它的设计初衷是为了提供比 int 更大的数值范围。
核心特点
- 表示整数:
long只能存储整数,不能存储小数或字符。 - 更大的范围:它的主要特点是比
int类型能表示的数值范围更大,它占用的内存空间至少为 4 个字节(32 bits),在现在的 64 位系统上通常是 8 个字节(64 bits)。 - 数值范围:
long是 4 字节(32位),其范围通常是 -2,147,483,648 到 2,147,483,647。long是 8 字节(64位),其范围通常是 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。
- 标准化的变体:为了更精确地控制大小,C 标准还定义了
long的其他变体:long int:与long完全相同,可以互换使用。signed long:明确表示这是一个有符号的长整型,与long默认行为相同。unsigned long:无符号长整型,只能存储非负数,范围是0到2^size_of_long_in_bits - 1。
重要提示:
long的大小在不同系统、不同编译器上可能不同,这是 C 语言为了适应不同硬件平台而做的设计,如果你需要一个固定大小的整数,应该使用<stdint.h>头文件中定义的类型,int32_t(32位整数) 或int64_t(64位整数)。
示例代码
#include <stdio.h>
int main() {
// 1. 声明一个 long 变量
long my_long = 123456789L; // 注意:L 或 l 后缀表示这是一个 long 常量
// 2. 打印 long 的值
printf("long 变量的值: %ld\n", my_long); // 输出: long 变量的值: 123456789
// %ld 是 long 的格式说明符
// 3. 打印 long 的大小(单位:字节)
printf("long 类型的大小: %zu 字节\n", sizeof(my_long)); // 输出通常是 4 或 8
// 4. 使用 unsigned long
unsigned long ul = 4294967295UL; // UL 后缀表示 unsigned long 常量
printf("无符号 long 的值: %lu\n", ul); // %lu 是 unsigned long 的格式说明符
// 5. long 可以存储非常大的整数
long big_number = 9223372036854775807L;
printf("一个很大的 long 数: %ld\n", big_number);
return 0;
}
long 和 char 的核心区别总结
| 特性 | char |
long |
|---|---|---|
| 主要用途 | 存储单个字符 | 存储大范围的整数 |
| 数据类型 | 字符型 | 整型 |
| 大小 | 固定为 1 字节 (8 bits) | 不固定,至少 4 字节,通常是 8 字节 |
| 数值范围 | 有符号: -128 到 127 无符号: 0 到 255 |
取决于大小: 32位: -2^31 到 2^31-1 64位: -2^63 到 2^63-1 |
| 格式化输出 | %c (字符), %d (整数) |
%ld (long), %lu (unsigned long) |
| 后缀 | 无 (字符常量用单引号 'A')整数常量可用 L/l (如 65L) |
L 或 l (如 123L)UL 或 ul (无符号) |
一个容易混淆的点:long char?
你可能会问,long char 是什么类型?

(图片来源网络,侵删)
答案是:C 语言标准中没有 long char 这个类型。
这是一个常见的误解,你可能想表达的是:
long和char是两种独立类型,不能组合成long char。- 或者你想表达的是一个
long类型的整数,它恰好对应一个字符的编码值。long char_code = 65L; // 这是一个 long 类型的变量,存储了字符 'A' 的编码值 char my_char = (char)char_code; // 将 long 强制转换为 char,得到 'A'
这里,
char_code是long类型,my_char才是char类型。
- 用
char来处理字符('a','1', )或小范围的整数(0-255)。 - 用
long来处理可能超出int范围的大整数。 char本质上是 1 字节的整数,而long是大小不固定的整数。long char是无效的语法,请将它们视为两个独立的概念。

(图片来源网络,侵删)
