C语言基本数据类型详解(新手入门,含示例、溢出与常见陷阱)
整型

基本整型(int)
编译系统分配给int型数据为2个字节或者4个字节(具体由编译器所决定,目前都是4 个字节,较老的编译器除外)。
存储形式(以下表示都以2个字节为列)
4个字节也就是32个二进制位,我们的存储单元内是用补码的形式存放。一个正数的补码就是其二进制形式
5的二进制为101其存储形式如下
如果是一个负数,则应先求出负数的补码
如-5先求出其绝对值的二进制101得到其原码
然后按位取反(每一个二进制为0变1,1变0)
最后加1就能得到-5的补码了
短整型(short int)
其类型名为 short 或 short int ,默认分配的字节数为2个字节。存储方式和int型一致。
一个短整型取值范围为-32768—32767 。
长整型(long int)
其类型名为 long 或 long int ,默认分配的字节数为4个字节。存储方式和int型一致。
一个长整型取值范围为-2147483648—2147483647 。
*双长整型(long long int)
其类型名为 long long 或 long long int ,默认分配的字节数为8个字节。存储方式和int型一致。
一个双长整型取值范围为-263—(263-1)
此类型为C99标准新增
字符型(char)
其类型名为 char ,默认分配的字节数为1个字节。存储方式和int型一致。
其主要以ASCLL码值的形式存放字符型数据,一般可以当做整型数据使用(不建议)。
举个例子:
char ch = 'A'; // ASCII码值为65
printf("%d\n", ch); // 输出 65
printf("%c\n", ch); // 输出 A
布尔型(bool)
其类型名为 bool ,它一般占用 1 个字节长度。bool 类型只有两个取值,true 和 false:true 表示“真”,false 表示“假”。
此类型为C99标准新增,C98之前使用:非0值表示为真,0表示为假。
使用示例:
#include <stdbool.h> // 使用bool需要包含这个头文件
bool flag = true;
if (flag) {
printf("条件成立\n");
}
无符号型详解
我们都知道数据存储中其最高位为符号位,无符号型就是将符号位变成数据位,从而可以表示更多或更大的数据。因为符号位变成了数据位,从而导致无符号型数据只能够表示正数,不能表示负数。
C语言中通常使用 signed 表示有符号的数据(如 signed int,signed 通常省略不写)
无符号数据通常使用 unsigned 来表示(如unsigned int,unsigned通常不能够省略)
示例:
unsigned int a = 4000000000; // 超出有符号int范围,但unsigned可以存下
printf("%u\n", a); // 用%u输出无符号整数
小提醒:不要把一个负数赋给无符号变量,否则会得到一个很大的正数(因为负数补码被当成正数解释)。
浮点型(小数类型)
C语言中用浮点型来表示小数。主要有三种:
单精度浮点型(float)
- 通常占用 4 个字节
- 有效数字大约 6~7 位
- 用
%f输出
双精度浮点型(double)
- 通常占用 8 个字节
- 有效数字大约 15~16 位
- 用
%lf输出(在printf中也可以用%f,但scanf必须用%lf)
长双精度浮点型(long double)
- 不同编译器大小不同,一般是 8、12 或 16 字节
- 精度更高,用
%Lf输出
简单示例:
float pi = 3.14159f; // 后面加f表示float常量
double e = 2.718281828459;
printf("圆周率:%f\n", pi);
printf("自然常数:%.10lf\n", e); // 控制小数点后10位
注意:浮点数在内存中是按科学记数法存储的,所以很多小数(比如0.1)无法精确表示,比较时不要直接用
==。
如何知道一个类型占几个字节?—— sizeof 运算符
sizeof 可以计算任何数据类型或变量占用的字节数。
示例:
#include <stdio.h>
int main() {
printf("int 大小:%zu 字节\n", sizeof(int));
printf("short 大小:%zu 字节\n", sizeof(short));
printf("long 大小:%zu 字节\n", sizeof(long));
printf("long long 大小:%zu 字节\n", sizeof(long long));
printf("float 大小:%zu 字节\n", sizeof(float));
printf("double 大小:%zu 字节\n", sizeof(double));
printf("char 大小:%zu 字节\n", sizeof(char));
printf("bool 大小:%zu 字节\n", sizeof(bool));
return 0;
}
运行结果会告诉你当前编译器下各类型所占的字节数。
不同类型之间的混合运算
当你把不同类型的数放在一起计算时,C语言会悄悄地进行类型转换,以免丢失精度。
自动类型转换(隐式转换)
- 小类型向大类型转换:比如
int和double运算,int会被自动转成double。 - 有符号和无符号:有符号可能会被转成无符号,这有时会带来意想不到的结果。
示例1:整数提升
char c = 100;
int i = c + 50; // c 先被自动转成 int,再计算
示例2:int 和 double 混合
int a = 5;
double b = 2.5;
double result = a + b; // a 被转成 5.0,结果是 7.5
示例3:有符号与无符号的坑
unsigned int u = 10;
int s = -5;
if (s < u) {
printf("s < u\n"); // 其实不会输出!因为 s 被转成很大的无符号数
} else {
printf("s >= u\n");
}
新人记住:尽量不要混用有符号和无符号,尤其不要拿它们比较大小。
强制类型转换(显式转换)
你可以在变量前面加 (类型名) 来手动转换。
示例:
double pi = 3.14159;
int ipi = (int)pi; // 截断小数部分,ipi = 3
printf("%d\n", ipi);
强制转换只是临时改变该运算结果的数据类型,不会改变变量本身的类型。
数据的溢出问题
每个数据类型能存储的数值都有一个范围。如果超出了这个范围,就会发生溢出。
有符号整数溢出
有符号整型溢出是未定义行为,程序可能崩溃或输出错误值。一定要避免。
无符号整数溢出
无符号整数会回绕:超出最大值后从 0 重新开始。
示例:
unsigned char uc = 255; // unsigned char 范围 0~255
uc = uc + 1;
printf("%d\n", uc); // 输出 0(回绕)
浮点数上溢/下溢
- 上溢:数值太大超出范围,会变成
inf(无穷大)。 - 下溢:数值太小趋近于 0,可能会变成
0。
示例:
float f = 1e30f; // 很大的数
f = f * 1e10f; // 上溢,f 变成 inf
常量后缀:告诉编译器我是什么类型
在写整数或小数常量时,可以加后缀明确它的类型。
| 后缀 | 类型示例 |
|---|---|
U |
100U → unsigned int |
L |
100L → long |
LL |
100LL → long long |
F |
3.14F → float |
LF |
3.14L → long double(注意是 L 不是 LF) |
示例:
long big = 100000L;
unsigned int u = 123U;
float f = 0.5F; // 不加F默认是double
新人可以暂时不记后缀,但看到别人代码里有要认识。
void 类型:一种特殊类型
void 表示“没有类型”,它常用于两种情况:
- 函数不返回任何值
void hello() {
printf("Hello\n");
// 没有 return 语句,或者 return;
}
- 函数不接受参数(C 语言中可省略,但明确写
void更安全)
int getNumber(void) {
return 42;
}
void不能直接声明变量,比如void x;是错误的。
新人常见错误与提醒
-
误以为 char 就是字符
其实 char 是整数类型,占 1 个字节,保存 ASCII 码。可以当小整数用,但注意范围是 -128~127(有符号)或 0~255(无符号)。 -
使用未初始化的变量
int x; // 未初始化,里面是随机值
printf("%d", x); // 危险!
- 比较浮点数是否相等
float a = 0.1f;
if (a == 0.1f) { // 可能不成立,因为0.1不能精确存储
...
}
// 应该检查差值是否小于一个很小的数,比如 fabs(a - 0.1) < 1e-6
- 忘记无符号数的陷阱
当循环条件中使用无符号变量并减到 0 以下时会变成很大的数,导致死循环。
for (unsigned int i = 10; i >= 0; i--) { // 死循环,i永远是>=0
printf("%u\n", i);
}
总结
C语言的基本数据类型是编程的基石,记住以下几点:
- 整数族:
short、int、long、long long,以及它们的unsigned版本。 - 浮点族:
float、double、long double。 - 字符:
char,本质是小整数。 - 布尔:
bool,取值true/false。 - 无符号:只能表示非负数,小心溢出和比较。
- 混合运算时会自动类型转换,必要时使用强制转换。
- 用
sizeof查看类型实际大小,不同平台可能不同。
多写代码、多打印输出,慢慢就会熟悉每种类型的行为习惯。
更多推荐







所有评论(0)