news 2026/5/15 21:55:09

C语言中的数据类型(详解内置类型)与sizeof操作符

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言中的数据类型(详解内置类型)与sizeof操作符

C语言的数据类型

  • 1.数据类型分类
  • 2.内置类型
    • a.字符型
      • a.1符号
      • a.2字符与ASCLL码关系
      • a.3字符型分类
    • b.整型
      • b.1符号
      • b.2整型分类
    • c.浮点型
      • c.1浮点型分类
    • d.布尔类型
      • d.1 符号
  • 3.sizeof操作符
    • a.数据类型的大小
    • b.sizeof介绍
    • c.sizeof使用
    • d.借sizeof补充说明内置类型占用内存的大小

1.数据类型分类

数据类型可分为两大类:内置类型自定义类型
(本文仅对内置类型做介绍,自定义类型请看后续文章~)

2.内置类型

a.字符型

a.1符号

字符的英文为 character,C语言中用char表示字符类型,字符即单个符号

#include<stdio.h>intmain(){chara='h';charb=',';charc='8';//'h',',','8'都为字符return0;}

a.2字符与ASCLL码关系

每个字符都对应一个ASCLL码值,ASCLL码表里记录了值和字符的对应情况,字符型变量存储的实际上是字符的ASCLL码值,而不是字符本身

所以,初始化字符型变量(即在定义字符型变量时给变量赋值)时可以直接用ASCLL码来初始化;打印字符时,也可以用ASCLL码值来打印

#include<stdio.h>intmain(){chara='h';//'h'的ASCLL码值是104(十进制下)charb=104;printf("a = %c,b = %c,c = %c",a,b,104);return0;}//运行结果为://a = h,b = h,c = h

a.3字符型分类

字符类型可分为两种:有符号字符无符号字符

有符号字符: 类型符号为 signed char,其中signed可省略,所以平常的char类型的字符默认是有符号字符
无符号字符: 类型符号为 unsigned char,其中unsigned不可省略

有符号与无符号字符的区别在下面讲到有符号整型和无符号整型时再说明

b.整型

b.1符号

整数的英文单词是 integer,C语言中用 int 来表示整型类型

#include<stdio.h>intmain(){inta=8;return0;}

b.2整型分类

(下面文字中用中括号 [ ] 包含的内容表示可以省略)
整型(int)可以分为四种:
短整型: short [ int ]整型:int长整型:long [ int ]更长的整型:long long [ int ]

他们的区别可以归纳为:
1.占用的内存大小从小到大(在下面谈sizeof函数时说明),short < int ≤ long ≤ long long
2.能存的数字范围从小到大(在之后谈二进制时说明原理)

(下面的范围全是有符号整型的范围)
short:− 2 15 -2^{15}215~2 15 − 1 2^{15}-12151
int:− 2 31 -2^{31}231~2 31 − 1 2^{31}-12311
long: 4字节− 2 31 ∼ 2 31 − 1 -2^{31} \sim 2^{31}-12312311或 8字节− 2 63 ∼ 2 63 − 1 -2^{63} \sim 2^{63}-12632631
long long:− 2 63 ∼ 2 63 − 1 -2^{63} \sim 2^{63}-12632631

上面说的这四种整形每种又可以分为有符号整型无符号整型
有符号整型:可以存负数,0,正数
无符号整型:只能存非负数

现在就可以说明char和unsigned char的区别了
前面说过,char类型变量实际上存的是字符对应的ASCLL码值,所以,char 和 unsigned char的区别就是:
char存的ASCLL码值可为负数,0,正数(-128 ~ 127)
unsigned char存的ASCLL码值只可为非负数(0 ~ 255)

(可以注意到,无符号存储的整数最大值大于有符号的,且基本是有符号最大值的两倍,这个原理也是在后面的二进制文章中会讲到)

c.浮点型

浮点型是用来存储小数的类型(但无法精确存储,原理在后面的存储文章里讲)

c.1浮点型分类

浮点型可分为三类:float(单精度浮点型)double(双精度浮点型)long double(长双精度浮点型)
他们的区别是:
1.占用的内存大小从小到大(在谈sizeof函数时说明),float < double ≤ long double
2.存的数字精度从小到大(原理在后面的存储文章里讲)

float:有效数字6-7 位 , double: 有效数字15-16位,long double:有效数字18位以上

3.他们能存储的数字的大小也不同(相对来说这个区别没那么重要)

d.布尔类型

C语言中本来没有布尔类型,是直接用0 表示假, 非0值 表示真
在C99标准中引入了布尔类型,专门表示真假

d.1 符号

布尔类型符号为 _Bool
使用布尔类型要包含头文件<stdbool.h>,而在头文件里,实现了下面的宏定义:

#definebool_Bool#definefalse0#definetrue1

所以,在包含了该头文件之后,可以直接用 bool 表示布尔类型,true 表示真 ,false 表示假

#include<stdio.h>#include<stdbool.h>intmain(){bool a=true;bool b=false;printf("a = %d,b = %d",a,b);return0;}//运行结果为://a = 1,b = 0

3.sizeof操作符

a.数据类型的大小

每一种数据类型都有自己的大小,单位为字节。使用不同数据类型,可以创建出占用内存大小不同的变量,占用的内存大小不同,存储的数据范围就有差异。

b.sizeof介绍

sizeof是一个操作符,是专门用来计算 操作数 的大小的,它会返回计算的结果,单位为字节
sizeof计算结果的类型为size_t,而size_t表示的是无符号整数

在32位系统上,size_t = unsigned int
64位下,windows是unsigned long long,linux/macos是unsigned long

sizeof的操作数可以为类型,也可以是变量表达式
(size_t实际上是C标准库中 typedef 定义的别名)【typedef后面会有文章讲到它】
(要使用该类型可以包<stdio.h>这个头文件)

c.sizeof使用

操作数是 类型时,语法为:
sizeof ( 操作数 )

(括号不能省略)

#include<stdio.h>intmain(){printf("%zu\n",sizeof(int));//4return0;}

操作数是 表达式 或 变量时,括号可以省略:
sizeof 操作数

注意:当操作数是表达式时,表达式不会真实计算,sizeof只在编译阶段分析:这个表达式的结果是什么类型?再计算对应类型的大小

请看下面示例,下面代码实现的是对sizeof结果的打印(int类型的大小为4个字节)

#include<stdio.h>intmain(){inta=99;intb=1;size_tj=sizeof(a=b+a);//因为sizeof的高优先级,避免系统按照 j = (sizeof a)=b+a 来理解赋值//这里给表达式带上括号printf("%zu\n",sizeofa);//结果为4printf("%zu\n",sizeofj);//因为表达式结果为int型数据,所以结果为4printf("a = %d\n",a);//结果为 a = 99,而不是a = 100//说明 sizeof(a=b+a) 中a=b+a这个表达式并没有执行,否则a会变成100return0;}

d.借sizeof补充说明内置类型占用内存的大小

上代码

#include<stdio.h>intmain(){printf("%zu\n",sizeof(_Bool));//结果为 1printf("%zu\n",sizeof(char));//结果为 1printf("%zu\n",sizeof(short));//结果为 2printf("%zu\n",sizeof(int));//结果为 4printf("%zu\n",sizeof(long));//结果为 4(或者8,由系统决定)printf("%zu\n",sizeof(longlong));//结果为 8printf("%zu\n",sizeof(float));//结果为 4printf("%zu\n",sizeof(double));//结果为 8printf("%zu\n",sizeof(longdouble));//结果为 8(或者16,同样由系统决定)return0;}

总结:
布尔类型_Bool: 1 字节
字符类型char:1 字节
整型:
short 2 字节
int 4 字节
long (windows)4 字节(Linux/macOS 64 位)8 字节
long long : 8 字节
浮点型:
float 4 字节
double 8 字节
long double
C标准只规定 long double 精度 ≥ double,没有规定其大小,所以不同编译器可以自由实现。
(windows系统下vs里是8字节, Linux 64 位下gcc里是16字节)

而对于每种类型的有符号(signed)与无符号(unsigned)形式,他们占用内存的大小完全一样,只是解释二进制的方式不同(在后面讲二进制的文章里会讲到),从而使得他们的存储范围不一样

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/15 21:53:40

四通道32孔生物源性检测仪 肉源性检测仪器

四通道32孔生物源性检测仪搭载四通道48孔高通量检测架构&#xff0c;本少、效率低的短板&#xff0c;大幅提升肉类质检筛查效率。多通道独立运行互不干扰&#xff0c;可一次性完成大批量肉类样本同步检测设备检测精度优异&#xff0c;可精准识别各类常见动物源性成分&#xff0…

作者头像 李华
网站建设 2026/5/15 21:53:27

镍基高温合金热挤压过程的数值模拟仿真

镍基高温合金热挤压过程的数值模拟仿真 摘要 镍基高温合金以其卓越的高温强度、抗蠕变性能和抗腐蚀性,在航空航天、核能发电等高端制造领域占据不可替代的地位。然而,正是这些优异的服役性能使其热加工难度极高,晶粒粗化、开裂倾向和动态再结晶行为的复杂性构成了工艺控制…

作者头像 李华
网站建设 2026/5/15 21:52:17

思源宋体CN:7种字重专业字体解决商业设计版权难题

思源宋体CN&#xff1a;7种字重专业字体解决商业设计版权难题 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为商业项目寻找高质量中文字体而支付昂贵授权费吗&#xff1f;思源宋…

作者头像 李华
网站建设 2026/5/15 21:51:07

AI视频工业化落地关键一步(Sora 2与Premiere深度耦合技术解密)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI视频工业化落地关键一步&#xff08;Sora 2与Premiere深度耦合技术解密&#xff09; Sora 2 并非孤立的生成模型&#xff0c;而是 Adobe Premiere Pro 2024.5 及以上版本原生集成的核心视频智能引擎。…

作者头像 李华
网站建设 2026/5/15 21:49:10

零基础转行网络安全攻略:一篇文章助你成功跳槽!

前言 最近在后台收到了部分私信&#xff0c;大部分都是关于网络安全转行的问题&#xff0c;其中&#xff0c;目前咨询最多的是&#xff1a;觉得现在的工作没有发展空间&#xff0c;替代性强&#xff0c;工资低&#xff0c;想跳槽转行网络安全。其中&#xff0c;大家主要关心的…

作者头像 李华