资讯动态

【C语言学习012】数据类型——整数类型

发布时间:2026/8/21 7:26:01 来源:尧图企业网站定制
在上一节中我们明确了比特、字节之间的关系也明白了不同类型的数据在内存中所占据的字节数是不同的在今天的内容开始之前我们还要新介绍一条语句sizeof从英文的角度出发size的意思是大小sizeof用于计算变量或类型在内存中所占的字符数是一种运算符在代码的编译过程中求值它的使用方式如下图要注意的是sizeof的规范写法是要在sizeof后面加括号但其实不加括号也能够正常使用要注意的是当sizeof作用于类型的时候必须要加括号如上图代码中对int、float和double的使用。另外sizeof的结果类型是size_t,我们需要用“%zu”来打印。同时可以注意到sizeof不仅仅可以作用于类型也可以作用于变量。我们定义了int类型的变量asizeofa的结果就是int类型的字节数。另外sizeof还能计算表达式的字节数如上图中a3.14a是int型加上3.14后变为了double型所以最终显示的字节数是double的字节数。要注意的是sizeof后面的括号中含有表达式时仅仅显示表达式结果的字节数并不会真的运算这个表达式并覆盖在下图中我们在a3.14之后再次打印a的值发现仍然是100而非103.14.接下来我们来系统介绍一下整数的数据类型整数的数据类型有五种在上方的图中展示的已经很清晰了分别是char、short、int、long以及longlong他们对应的字节也都进行了展示比较耐人寻味的是long给出的典型大小有两种更重要的是其实不止long有着不确定的字节数其它的几个类型也有同样的情况这是怎么回事呢我们得从更原理一点的东西讲起先说CPU在上一篇中我们将内存比作了储物柜我们说CPU会从储物柜中取东西并做运算那CPU在哪里做运算呢事实上CPU内部有几个极小的存储位置叫做寄存器register将CPU比作你的办公桌内存就是你身后的文件柜而寄存器就是你办公桌上的几个便签数量很少但对于你而言拿便签肯定是要比起身去文件柜中取东西方便得多。所以CPU做运算时的流程是把数据从内存中取出搬到寄存器之后在寄存器里做运算最后把结果从寄存器中搬回到内存。你明白了这个流程你也就明白了一件事寄存器的大小决定了CPU一次能处理多少的数据。寄存器既然有存储功能那他当然就会有“存储容量”。目前的寄存器有两种一种能装32个比特另一种能装64个比特我们把这种容量叫做寄存器的“宽度”。同时由于寄存器在CPU中倘若CPU中的寄存器是能装32比特的寄存器我们就把这个CPU叫做32位CPU同样的若CPU中的寄存器能装64比特我们就称之为64位CPU。从直观上来看64位CPU要比32位CPU好很多但对于任何事物的选择都是“适合”最重要常规的“好”不一定代表任何场景都更好。在现实中几乎所有的电脑和手机都已经是64位了。我们继续我们说CPU和内存之间要来回传递数据而这个传递数据的通道就叫做总线bus。他们之间的关系如下图其中数据总线负责搬运数据地址总线负责传递地址信息。地址总线的宽度决定了CPU能“寻址”多少内存空间如下图这也解释了一个常见的现象32位电脑最多只能用4GB内存即使插入8GB内存条系统也只能识别到4GB。说回数据类型C语言中没有规定int是几个字节它只说“int至少16位2字节但具体多大由编译器和平台决定”原因是int的大小通常等于CPU寄存器的大小这样CPU处理起来最高效。在32位系统上CPU寄存器32位int 4字节刚好填满一个寄存器在16位系统上int就是2字节在64位系统上int是4字节是不是又有疑问了我不是刚才才说int的大小通常等于寄存器大小吗为什么在64位系统上int不是8字节而仍是4字节呢这主要是由于历史发展的缘故1972年C语言诞生 当时只有16位机器int为2字节。1985年才正式出现32位CPU同时期的1989年C语言标准发布并未规定int大小只说至少16位这是因为当时16位和32位系统共存。在1999年C99标准发布引入了longlong至少64位引入stdint.h固定宽度类型。直到2003年64位CPU出现但是由于32位时代已经持续了18年这期间产生了大量的代码且这些代码都依赖着int4字节这一标准所以在64位时代并没有改变int的大小只是当int实在不够用时才采取用longlong的方式。另外换个角度而言4字节已经能满足绝大多数的场景不仅如此使用4字节相比起8字节还能够节省内存再加上C语言标准未强制规定所以int仍然保持着4字节的模样。说完了int再来说说longlong在不同平台上也不一样规律是而longlong由于有着C99标准的要求longlong保证至少8字节64位下图是一个汇总对比其实纵观下来char始终为1字节short始终为2字节int始终为4字节longlong始终为8字节。long大多数情况下为4字节只有在64为的linux/Mac中才为8字节。所以下面这段代码在不同的系统中对应的输出当然也会不同总的来说数据类型的大小之所以在不同系统上不同是因为它本质上是在配合 CPU 的工作宽度。CPU 的寄存器多宽、总线多宽决定了哪种大小的数据处理起来最高效。而 C 语言把这个选择权留给了编译器所以同一个类型在不同平台上大小可能不同。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价