当前位置: 首页 > news >正文

C语言整数类型

整数是编程中常用的一种数据,C语言通常使用int来定义整数(int 是 integer 的简写)。

在现代操作系统中,int一般占用 4 个字节(Byte)的内存,共计 32 位(Bit)。如果不考虑正负数,当所有的位都为 1 时它的值最大,为 232-1 = 4,294,967,295 ≈ 43亿,这是一个很大的数,实际开发中很少用到,而诸如 18、520、1024 等较小的数使用频率反而较高。

使用 4 个字节保存较小的整数绰绰有余,会空闲出两三个字节来,这些字节就白白浪费掉了,不能再被其他数据使用。现在个人电脑的内存都比较大了,配置低的也有 2G,浪费一些内存不会带来明显的损失;而在C语言被发明的早期,或者在低端单片机中,内存都是非常稀缺的资源,所有的程序都在尽力节省内存。

反过来说,43 亿虽然已经很大,但要表示全球人口数量还是不够,必须要让整数占用更多的内存,才能表示更大的值,比如占用 6 个字节或者 8 个字节。

让整数占用更少的内存可以在 int 前边加short,让整数占用更多的内存可以在 int 前边加long,还不够的话可以在 int 前面加两个 long,例如:

short int a = 18; short int b, c = 520; long int m = 102023; long int n, p = 562131; long long int x = 12233720; long long int y, z = 92949685;

这样 a、b、c 各自只占用 2 个字节的内存,m、n、p可能占用 8 个字节,x、y、z 各自占用 8 个字节。

也可以将 int 省略,只写 short、long 和 long long,如下所示:

short a = 18; short b, c = 520; long m = 102023; long n, p = 562131; long long x = 12233720; long long y, z = 92949685;

这样的写法更加简洁,实际开发中常用。

int 是基本的整数类型,short、long 和 long long 是在 int 的基础上进行的扩展,short 可以节省内存,long 和 long long 可以容纳更大的值。

short、int、long 是C语言中常见的整数类型,long long 在某些场景中也会用到。其中,int 称为整型,short 称为短整型,long 称为长整型,long long 称为超长整形。

整型的长度

细心的读者可能会发现,上面我们在描述 short、int、long、long long 类型的长度时,只对 short 和 long long 使用肯定的说法,而对 int、long 使用了“一般/可能”等不确定的说法。这种描述的言外之意是,short 和 long long 的长度是确定的,分别是 2 和 8 个字节,而 int、long 的长度无法确定,在不同的环境下有不同的表现。

一种数据类型占用的字节数,称为该数据类型的长度。例如,short 占用 2 个字节的内存,那么它的长度就是 2。

实际情况也确实如此,C语言并没有严格规定 short、int、long、long long 的长度,只做了宽泛的限制:

  • short 至少占用 2 个字节。
  • int 建议为一个机器字长。32 位环境下机器字长为 4 字节,64 位环境下机器字长为 8 字节。
  • short 的长度不能大于 int,long 的长度不能小于 int,long long 不能小于 long。

总结起来,它们的长度(所占字节数)关系为:

2 ≤ short ≤ int ≤ long ≤ long long

这就意味着,short 并不一定真的“短”,long 也并不一定真的“长”,它们有可能和 int 占用相同的字节数。同样,long long 也不一定真的比 long 长,它们占用的字节数可能相同。

在 16 位环境下,short 的长度为 2 个字节,int 也为 2 个字节,long 为 4 个字节,long long 为 8 个字节。在单片机/嵌入式领域,16 位环境很少使用了,一般使用 8/32/64 位环境;在 PC 和服务器领域,16 位环境早就已经消失了。

对于 32 位的 Windows、Linux 和 macos,short 的长度为 2 个字节,int 为 4 个字节,long 也为 4 个字节,long long 为 8 个字节。PC 和服务器上的 32 位操作系统占有率越来越低,基本都被 64 位替代了;而单片机/嵌入式领域,使用 32 位环境越来越多了,8 位环境越来越少了。

在 64 位环境下,不同的操作系统会有不同的结果,如下所示:

操作系统shortintlonglong long
Win64(64位 Windows)2448
类Unix系统(包括 Unix、Linux、macOS、BSD、Solaris 等)2488

目前我们使用较多的 PC 系统为 Win 7/8/10/11、macOS、Linux,在这些系统中,short、int 和 long long 的长度都是固定的,分别为 2、4 和 8,大家可以放心使用,只有 long 的长度在 Win64 和类 Unix 系统下会有所不同,使用时要注意移植性。

sizeof 操作符

获取某个数据类型的长度可以使用 sizeof 操作符,如下所示:

​ #include <stdio.h> int main() { short a = 10; int b = 100; int short_length = sizeof a; int int_length = sizeof(b); int long_length = sizeof(long); int longlong_length = sizeof(long long); printf("short=%d, int=%d, long=%d, longlong=%d\n", short_length, int_length, long_length, longlong_length); return 0; } ​

在 32 位环境以及 Win64 环境下的运行结果为:

short=2, int=4, long=4, longlong=8

在 64 位 Linux 和 macOS 下的运行结果为:

short=2, int=4, long=8, longlong=8

sizeof 用来获取某个数据类型或变量所占用的字节数,如果后面跟的是变量名称,那么可以省略( ),如果跟的是数据类型,就必须带上( )

需要注意的是,sizeof 是C语言中的操作符,不是函数,所以可以不带( ),后面会详细讲解。

不同整型的输出

使用不同的格式控制符可以输出不同类型的整数,它们分别是:

  • %hd用来输出 short int 类型,hd 是 short decimal 的简写;
  • %d用来输出 int 类型,d 是 decimal 的简写;
  • %ld用来输出 long int 类型,ld 是 long decimal 的简写;
  • %lld用来输出 long long int 类型,lld 是 long long decimal 的简写。

下面的例子演示了不同整型的输出:

#include <stdio.h> int main() { short a = 18; int b = 520; long c = 1024; long long d = 102023; printf("a=%hd, b=%d, c=%ld, d=%lld\n", a, b, c, d); return 0; }

运行结果:

a=18, b=520, c=1024, d=102023

在编写代码的过程中,我建议将格式控制符和数据类型严格对应起来,养成良好的编程习惯。当然,如果你不严格对应,一般也不会导致错误,例如,很多初学者都使用%d输出所有的整数类型,请看下面的例子:

#include <stdio.h> int main() { short a = 18; int b = 520; long c = 1024; long long d = 102023; printf("a=%d, b=%d, c=%d, d=%d\n", a, b, c, d); return 0; }

运行结果仍然是:

a=18, b=520, c=1024, d=102023

当使用%d输出 short,或者使用%ld输出 short、int,又或者使用%lld输出 short、int 和 long 时,不管值有多大,都不会发生错误,因为格式控制符足够容纳这些值。

当使用%hd输出 int、long、long long,或者使用%d输出 long、long long,又或者使用%ld输出 long long 时,如果要输出的值比较小(就像上面的情况),一般也不会发生错误,如果要输出的值比较大,就很有可能发生错误,例如:

#include <stdio.h> int main() { int m = 306587; long n = 28166459852; printf("m=%hd, n=%hd\n", m, n); printf("n=%d\n", n); return 0; }

在 64 位 Linux 和 macOS 下(long 的长度为 8)的运行结果为:

m=-21093, n=4556 n=-1898311220

输出结果完全是错误的,这是因为%hd容纳不下 m 和 n 的值,%d也容纳不下 n 的值。感兴趣的话,还可以在 Windows 环境中测试用%ld输出较大的 long long 类型整数(比如 28166459852),会发现输出结果也是错误的。

读者需要注意,当格式控制符和数据类型不匹配时,编译器会给出警告,提示程序员可能会存在风险。

编译器的警告是分等级的,不同程度的风险被划分成了不同的警告等级,而使用%d输出 short、long 和 long long 类型的风险较低,如果你的编译器设置只对较高风险的操作发出警告,那么此处你就看不到警告信息。

不同整形的后缀

读到这里,大家已经学完了 short、int、long 和 long long 四种整数类型,假设程序中有一个整数 100,它是什么类型的呢?

实际开发中用到的整数,它们的值通常不会很大,类型默认为 int。如果整数的值很大,需要占用比 int 更多的内存,它的类型可能是 long、long long 等(还可能是无符号整形,后续会讲)。

举个简单的例子:

long a = 100; int b = 294;

单纯看 100 和 294 这两个整数,它们的类型都是 int。分析这两行代码:

  • 第一行:变量 a 的类型是 long,整数 100 的类型是 int,它们的类型不同,编译器会先将 100 的类型转换成 long,再将它赋值给 a;
  • 第二行:变量 b 的类型是 int,整数 294 的类型是 int,它们的类型相同,编译器直接将 294 赋值给变量 b。

关于数据类型的转换,这里先简单了解一下,我们将在《C语言数据类型转换》一节中深入探讨。

对于数值不是很大的整数,我们也可以手动指定它们的类型为 long 和 long long,具体写法是:

  • 整数后面紧跟 l(小写的 L)或者 L,表明它的类型是 long;
  • 整数后面紧跟 ll(小写的 LL)或者 LL,表明它的类型是 long long。

举个简单的例子:

int a = 10; long b = 100L; long long c = 1000LL; short d = 32L;

其中,10 的类型是 int,100 和 32 的类型是 long,1000 的类型是 long long。我们习惯把 L、LL 这样的类型标识叫做整数的后缀。

再次强调,一个整数赋值给某个变量时,它们的类型不一定相同,比如将 100L 赋值给 b,它们的类型是相同的;再比如将 32L 赋值给 d,它们的类型是不同的,编译器会先将 32 转换为 short 类型,然后再赋值给 d。

对于初学者,很少会用到数字的后缀,加不加往往没有什么区别,也不影响实际编程。但是既然系统地学习 C语言,这个知识点还是要掌握的,否则哪天看到别人的代码这样写,你却不明白怎么回事,那就尴尬了。

http://www.jsqmd.com/news/954075/

相关文章:

  • 2026最新焊接工作站工厂实测评测:四大品牌核心能力横向对比 - 奔跑123
  • 2026年Q2淮南牛肉汤歌、淮南牛肉汤动漫歌 权威推荐TOP5榜 - 安互工业信息
  • 5分钟掌握百度网盘直链解析:告别龟速下载的完整指南
  • 市场纤维水泥压力板厂商
  • 2026年最新宿州市黄金回收白银回收铂金回收彩金回收TOP5靠谱门店甄选 识店+辨价+安全交易指南及联系方式推荐 - 前途无量YY
  • 2026 池州防水补漏三家品牌测评:厨卫屋面地下室修缮哪家靠谱?吉修匠 99.8 分五星稳居榜首 - 吉修匠
  • Flutter国内镜像又挂了?别慌,手把手教你快速切换到清华/腾讯云等可用镜像源
  • 成都地区茅台酒回收靠谱商家推荐榜单,2026 优选头部品牌,飞天 生肖 年份茅台上门变现指南 - 资讯焦点
  • 别再搞混了!ArcMap里‘定义投影’和‘投影’到底啥区别?手把手教你选对工具
  • CBCX:监管意识与信息透明度的观察
  • 小学生算术练习神器:从 0 到 1 开发一款趣味数学小软件
  • 记一次网卡故障
  • AIR-SARShip-1.0数据集预处理实战:如何设计滑动窗口裁剪策略并同步更新XML标注文件
  • OpenAI 推 ChatGPT 会话控制功能,却难敌模型迭代,企业治理挑战重重!
  • 浙江GEO 源头厂商第一梯队发展现状与行业落地路径深度解析 - 浙江稻盛和夫
  • 2026 亳州防水补漏三家品牌横向测评:厨卫屋面地下室修缮哪家靠谱?吉修匠 99.8 分五星稳居榜首 - 吉修匠
  • 从PRONOSTIA平台到你的模型:手把手教你用FEMTO-ST轴承数据做寿命预测
  • Matlab车辆检测全流程代码包:从图像预处理到HOG+SVM识别,含多组实测样例与结果图
  • Cartographer纯定位模式快速重定位:手把手教你修改源码设置初始位姿(附避坑指南)
  • 深入解读Spartan-6引脚功能表:除了当GPIO,这些引脚还能怎么用?
  • 五大云桌面品牌全解析,谁才是芯片行业真正的实力派? - 资讯焦点
  • 炉石传说HsMod终极指南:如何用5个实用功能彻底优化你的游戏体验
  • 数据科学家的数学实战手册:从故障归因到模型创造
  • 芯片设计企业协同办公与数据防泄漏解决方案 - 资讯焦点
  • 第14章:多模态AI实战 —— 让AI“看懂“图片和文档
  • Nicotine+:一款开源的 Soulseek P2P 图形客户端
  • p08 2.3 贝尔曼方程_cdn
  • 上海会通EXDEMB防爆电机技术参数解析与工业场景适配指南 - 奔跑123
  • 重庆市日立中央空调维修师傅电话|各区金牌师傅,靠谱选欧米到家 - 欧米到家
  • AI认知品牌包装(ACBP):生成式AI时代,品牌建设的范式革命