char与int底层存储差异大吗?

99ANYc3cd6
预计阅读时长 17 分钟
位置: 首页 C语言 正文

核心定义与用途

  • char (Character - 字符类型)

    c语言char和int的区别
    (图片来源网络,侵删)
    • 用途:主要用于存储单个字符,'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

c语言char和int的区别
(图片来源网络,侵删)
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 支持的算术和关系运算符。

算术运算

charint 都支持 , , , , 等运算。

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

关系运算

它们都支持 >, <, , 等比较。

c语言char和int的区别
(图片来源网络,侵删)
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;
}

输入/输出

charint 使用不同的格式化占位符进行输入和输出。

类型 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 语言是一种弱类型语言,允许在 charint 之间进行隐式或显式的类型转换。

  • 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. 当你明确需要处理单个字符时(读取用户输入的一个字母)。
    2. 当你需要一个占用内存空间很小的整数(1字节),并且确定其数值范围在 -128 到 127 之间时(标志位 char is_ready = 1;)。
    3. 在处理字符串时,字符串就是由 char 数组组成的。
  • 使用 int 的情况

    1. 当你需要进行常规的数学计算(加减乘除)时。
    2. 当你需要存储一个可能超出 char 范围的整数时。
    3. 当用作循环计数器时(for (int i = 0; i < 100; i++))。
    4. 当你需要一个通用的整数类型时,int 是首选,除非你有特别的理由(如节省内存)选择 shortchar

希望这个详细的对比能帮助你彻底理解 charint 的区别!

-- 展开阅读全文 --
头像
dede为何无法连接数据库?
« 上一篇 今天
dede如何跨站调用其他网站数据库?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

目录[+]