核心定义与用途
-
char(Character - 字符类型)
(图片来源网络,侵删)- 用途:主要用于存储单个字符,
'a','B','1', 等,在 C 语言中,字符本质上是一个小整数,它使用 ASCII(或类似的编码)表将字符映射到一个整数值。'A'的 ASCII 值是 65,'a'是 97,'0'是 48。 - 本质:它是一个小整数,其大小通常为 1 个字节,它的主要用途是表示字符,但在底层操作时,它被当作整数来处理。
- 用途:主要用于存储单个字符,
-
int(Integer - 整数类型)- 用途:用于存储整数,没有小数部分。
10,-100,0,32767等,它是 C 语言中最常用的整数类型,用于进行数学计算、循环计数、数组索引等。 - 本质:它是一个整数,其大小在大多数现代系统上是 4 个字节(32位系统)或 8 个字节(64位系统)。
- 用途:用于存储整数,没有小数部分。
内存大小与取值范围
这是两者最直观的区别。
| 特性 | char |
int |
|---|---|---|
| 典型大小 | 1 字节 (8 bits) | 4 字节 (32 bits) 或 8 字节 (64 bits) |
| 有符号取值范围 | -128 到 127 | -2,147,483,648 到 2,147,483,647 (32位) -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 (64位) |
| 无符号取值范围 | 0 到 255 | 0 到 4,294,967,295 (32位) 0 到 18,446,744,073,709,551,615 (64位) |
注意:char 的大小在标准中规定为 1 字节,而 int 的大小取决于具体的实现(编译器和操作系统),你可以使用 sizeof 运算符来查看在你的系统上它们的确切大小。
#include <stdio.h>
int main() {
printf("Size of char: %zu bytes\n", sizeof(char)); // 几乎总是输出 1
printf("Size of int: %zu bytes\n", sizeof(int)); // 在32位系统输出4,64位系统输出4或8
return 0;
}
赋值与初始化
char 的赋值
你可以用字符常量(单引号括起来)或整数来初始化 char。

char c1 = 'A'; // 正确,存储字符 'A' char c2 = 65; // 正确,存储 ASCII 码为 65 的字符,也就是 'A' char c3 = '7'; // 正确,存储字符 '7',其 ASCII 码是 55 char c4 = 55; // 正确,存储 ASCII 码为 55 的字符,也就是 '7'
int 的赋值
你只能用整数常量来初始化 int。
int i1 = 100; // 正确 int i2 = 'A'; // **正确,但会进行隐式类型转换**。'A' (65) 会被赋值给 i1,i1 的值是 65 int i3 = "hello"; // **错误**!不能将字符串指针赋给整型变量
运算符
由于 char 在本质上是整数,所以它支持大部分 int 支持的算术和关系运算符。
算术运算
char 和 int 都支持 , , , , 等运算。
char c = 'A'; // ASCII 65
int result = c + 1; // result 的值是 66
// 如果打印 char,它会显示对应的字符
printf("%c\n", c + 1); // 输出 'B'
int i = 10;
int result2 = i * 2; // result2 的值是 20
关系运算
它们都支持 >, <, , 等比较。

char c1 = 'a'; // 97
char c2 = 'b'; // 98
if (c1 < c2) {
printf("'a' is less than 'b'\n"); // 总是成立
}
int i1 = 10;
int i2 = 20;
if (i1 < i2) {
printf("10 is less than 20\n"); // 总是成立
}
关键区别: 和 运算符
这是一个非常重要的区别点:
-
char的 /:当你对一个char变量进行 或 操作时,它会在其 ASCII 值上进行递增或递减,当超出范围时,它会回绕(wrap around)。'z'(122) 加 1 会变成 (123),而char的最大值 127 加 1 会变成 -128。 -
int的 /:int的 / 也是标准的整数递增/递减,但它的范围非常大,通常不会轻易发生回绕,除非你进行非常大的数值运算。
#include <stdio.h>
int main() {
// char 的回绕
char c = 127;
printf("c before ++: %d (char: %c)\n", c, c); // 输出 127 (char: �)
c++;
printf("c after ++: %d (char: %c)\n", c, c); // 输出 -128 (char: �)
// int 的回绕(需要更大的数值)
int i = 2147483647; // 32位 int 的最大值
printf("i before ++: %d\n", i); // 输出 2147483647
i++;
printf("i after ++: %d\n", i); // 输出 -2147483648 (发生回绕)
return 0;
}
输入/输出
char 和 int 使用不同的格式化占位符进行输入和输出。
| 类型 | printf 输出 |
scanf 输入 |
|---|---|---|
char |
%c (打印字符) |
%c (读取字符) |
int |
%d (打印十进制整数) |
%d (读取十进制整数) |
示例:
#include <stdio.h>
int main() {
char c;
int i;
printf("Enter a character: ");
scanf("%c", &c);
printf("Enter an integer: ");
scanf("%d", &i);
printf("You entered character: %c\n", c);
printf("You entered integer: %d\n", i);
return 0;
}
类型转换
C 语言是一种弱类型语言,允许在 char 和 int 之间进行隐式或显式的类型转换。
-
char->int(隐式):这是最常见的,当你将一个char变量用在需要int的地方时,编译器会自动将其提升为int,这通常被称为整型提升。char c = 'A'; // 65 int i = c; // i 的值是 65
-
int->char(隐式):当你将一个int赋值给char时,int的高位字节会被截断,只保留低 8 位。int i = 66; // 01000010 char c = i; // c 的值是 'B' int j = 200; // 11001000 char d = j; // d 的值是 -56 (因为最高位是1,被解释为负数)
总结表格
| 特性 | char |
int |
|---|---|---|
| 主要用途 | 存储单个字符 | 存储整数 |
| 本质 | 1字节大小的整数 | 4或8字节大小的整数 |
| 内存大小 | 1 字节 | 4 或 8 字节 |
| 典型取值范围 | -128 ~ 127 | 约 ±21亿 (32位) 或更大 |
| 运算符支持 | 大部分算术、关系运算 | 完整的算术、关系、位运算 |
| I/O 格式 | %c |
%d |
| 类型转换 | 可隐式转为 int (整型提升) |
赋给 char 时会截断高位 |
何时使用哪个?
-
使用
char的情况:- 当你明确需要处理单个字符时(读取用户输入的一个字母)。
- 当你需要一个占用内存空间很小的整数(1字节),并且确定其数值范围在 -128 到 127 之间时(标志位
char is_ready = 1;)。 - 在处理字符串时,字符串就是由
char数组组成的。
-
使用
int的情况:- 当你需要进行常规的数学计算(加减乘除)时。
- 当你需要存储一个可能超出
char范围的整数时。 - 当用作循环计数器时(
for (int i = 0; i < 100; i++))。 - 当你需要一个通用的整数类型时,
int是首选,除非你有特别的理由(如节省内存)选择short或char。
希望这个详细的对比能帮助你彻底理解 char 和 int 的区别!
