整型

数据类型所占字节数

基本整型(int)

编译系统分配给int型数据为2个字节或者4个字节(具体由编译器所决定,目前都是4 个字节,较老的编译器除外)。

存储形式(以下表示都以2个字节为列)

4个字节也就是32个二进制位,我们的存储单元内是用补码的形式存放。一个正数的补码就是其二进制形式
5的二进制为101其存储形式如下
5在内存中的表示

如果是一个负数,则应先求出负数的补码
如-5先求出其绝对值的二进制101得到其原码
5在内存中的表示
然后按位取反(每一个二进制为0变1,1变0)
取反
最后加1就能得到-5的补码了
请添加图片描述

短整型(short int)

其类型名为 shortshort int ,默认分配的字节数为2个字节存储方式和int型一致。
一个短整型取值范围为-32768—32767 。

长整型(long int)

其类型名为 longlong int ,默认分配的字节数为4个字节存储方式和int型一致。
一个长整型取值范围为-2147483648—2147483647 。

*双长整型(long long int)

其类型名为 long longlong 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语言会悄悄地进行类型转换,以免丢失精度。

自动类型转换(隐式转换)

  • 小类型向大类型转换:比如 intdouble 运算,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 表示“没有类型”,它常用于两种情况:

  1. 函数不返回任何值
void hello() {
    printf("Hello\n");
    // 没有 return 语句,或者 return;
}
  1. 函数不接受参数(C 语言中可省略,但明确写 void 更安全)
int getNumber(void) {
    return 42;
}

void 不能直接声明变量,比如 void x; 是错误的。


新人常见错误与提醒

  1. 误以为 char 就是字符
    其实 char 是整数类型,占 1 个字节,保存 ASCII 码。可以当小整数用,但注意范围是 -128~127(有符号)或 0~255(无符号)。

  2. 使用未初始化的变量

int x;          // 未初始化,里面是随机值
printf("%d", x); // 危险!
  1. 比较浮点数是否相等
float a = 0.1f;
if (a == 0.1f) {  // 可能不成立,因为0.1不能精确存储
    ...
}
// 应该检查差值是否小于一个很小的数,比如 fabs(a - 0.1) < 1e-6
  1. 忘记无符号数的陷阱
    当循环条件中使用无符号变量并减到 0 以下时会变成很大的数,导致死循环。
for (unsigned int i = 10; i >= 0; i--) {  // 死循环,i永远是>=0
    printf("%u\n", i);
}

总结

C语言的基本数据类型是编程的基石,记住以下几点:

  • 整数族shortintlonglong long,以及它们的 unsigned 版本。
  • 浮点族floatdoublelong double
  • 字符char,本质是小整数。
  • 布尔bool,取值 true / false
  • 无符号:只能表示非负数,小心溢出和比较。
  • 混合运算时会自动类型转换,必要时使用强制转换。
  • sizeof 查看类型实际大小,不同平台可能不同。

多写代码、多打印输出,慢慢就会熟悉每种类型的行为习惯。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐