虽说C语言是一门很成熟的编程语言,但是近些年来也是有所发展的,从早期的C89到后来的C99、C11等新标准,C语言逐步增加了许多好用的功能,例如新标准头文件“stdint.h”的添加。

C语言逐步增加了许多好用的功能

stdint.h头文件

如果程序员希望写出可移植的C语言程序,首先最重要的一点是不能假定位宽。C语言标准并没有明确指定的 short、int、long 等类型的位宽,因此可能在某些平台 sizeof(int) 等于 2,在其他平台 sizeof(int) 等于 4,所以如果编写的C语言代码假定 sizeof(int) 是一个固定值,显然就属于不可移植的代码。

为了解决这样的问题,在新标准文件“stdint.h” 之前,程序员必须做些额外的工作,以确定C语言代码运行的平台的各种数据位宽,这样的工作着实烦人,稍不留神就会出错。

“stdint.h”头文件的添加就是为了便于程序员写出不假定位宽的程序的。其内部通过 typedef 和宏判断定义了不少好用的整数类型,例如 int8_t 类型表示 8 位的有符号的整数类型,uint32_t 则表示 32 位的无符号的整数类型。类似的,还有 int16_t、int64_t、uint64_t 等类型,都是比较好理解的。

C语言中的“快”类型

不过,如果读者打开 stdint.h 头文件,应该能够看到一些更有趣的类型,如下图:

更有趣的类型

可以看出,这些类型被称作“fast type”,类型名中也有 fast 的字样(如 int_fast16_t),直译成中文即“快类型”,那么它们到底有什么含义呢?

观察力敏锐的读者应该发现了,int_fast16_t 和 int_fast32_t 其实是一样的,以上图黄框为例,它们都表示 int 类型,这是怎么回事呢?int 类型怎么能同时表示 16 位宽和 32 位宽的整数类型呢?

int 类型当然不能同时表示两种位宽的整数类型,事实上,int_fastxx_t 类型并不是准确的 xx 位宽类型,它表示不低于 xx 位宽的类型,因此,只要 int 的位宽大于或者等于 32 位,它就能同时表示 int_fast16_t 和 int_fast32_t 类型。

有读者看到这里可能会有疑问,如果 int 的位宽等于 32,那么使用它来表示 16 位宽的 int_fast16_t 整数类型,不是造成资源浪费了吗?

不是造成资源浪费了吗?

其实读者应将注意力放在“fast”一词上。CPU 从内存取数据一般是逐字取的,这里的“字”并不是字节的意思,在 32 位主机上,字长常常是 4 个字节,也即 CPU 单次取出数据的最小单位是 4 个字节。

字长也可以理解为 CPU 读取数据的“步长”。

也就是说,CPU 读取数据的“步长”是字长(下文以4字节为例),也就是说假设这次读取了地址 0~3 的数据,接下来若是希望读取相邻的数据,最接近的地址也得是地址 4~7。其实从这里可以看出,CPU 每次读取数据的起始地址都是字长的整数倍。

这也是“数据对齐”的原因——为了CPU读取数据的效率。

如果需要读取的数据只有一个字节(char 型),那么显然,无论该字节放在哪里,它总是在某个字长段的范围内的(例如地址 0~3,地址 4~7 内),此时 CPU 一次就能读取完毕。

CPU 一次就能读取完毕。

如果需要读取的数据有两个字节(16bits),情况就不同了——它的地址可能是 3~4,而 CPU 读取数据的“步长”是 4 个字节,若要读取该值,CPU 只能先读取 0~3 字节的数据,再读取 4~7 字节的数据,最后还需要组合拼凑,才能得到该值。这样的一系列操作显然非常低效。

所以 stdint.h 将“快”类型定义为字长的整数倍的意图就一目了然了,无非就是牺牲一些“空间”换取“时间”。当然了,读者在使用“快类型”时需要注意:int_fast16_t 并不一定恰好是 16 位宽,它只是不少于 16 位宽的类型。

C语言中的“小”类型

前面提到,int_fastxx_t 类型牺牲了“空间”换取“时间”,如果在某个C语言项目中,“空间”效率并不是特别重要,而“空间”效率却非常重要,那么 int_fastxx_t 类型显然就不合适了。此时可以使用 stdint.h 中定义的 “small type”,也即“小类型”。

C语言中的“小类型”

int_leastxx_t 系列的数据类型基本上保证了其恰好是 xx 位宽,避免了空间浪费,但是按照前文的分析,“小类型”付出的代价是损失了一部分时间效率。

c语言查看cpu温度代码_很多程序员都不知道,C语言中还有“快类型”和“小类型”...相关推荐

  1. c语言查看cpu温度代码_树莓派学习笔记——短短几行C语言代码获取树莓派的CPU温度...

     玩转树莓派 标签: 树莓派CPU温度 前言 本文通过文件操作读取树莓派CPU温度,在linux系统中任何设备的操作都被抽象成为文件读写,通过读取/sys/class/thermal/thermal_ ...

  2. 一般项目中哪里体现了数据结构_优秀程序员都应该学习的数据结构与算法项目(GitHub 开源清单)...

    前言 算法为王. 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手:只有内功深厚者,前端之路才会走得更远. 强烈推荐 GitHub 上值得前端学习的数据结构与算法项目,包含 gif ...

  3. visual foxpro 程序员指南_好程序员云计算培训分享云计算中SOA是什么?

    好程序员云计算培训分享云计算中SOA是什么?云计算中SOA是什么?SOA 是面向服务的架构,即企业的 IT 系统是由服务组成的,也即企业的各个应用系统是由许多标准的服务件"组装"起 ...

  4. props写法_好程序员web前端培训React中事件的写法总结

    好程序员web前端培训React中事件的写法总结,React的事件处理和DOM元素很相似,但是语法上是有不同的: 1.react事件采用驼峰命名法,而不是纯小写. 驼峰命名法(camelCase):命 ...

  5. 入党对程序员有什么用_为什么程序员都喜欢用两个大屏显示器?网友:一个复制一个粘贴...

    如今的程序员似乎对办公电脑的配置要求非常高,连一些相对普通的配置都不入他们的"法眼"!都要比较先进的配置.不过想想也是,毕竟电脑是他们天天打交道的玩意.然而笔者却发现,程序员的办公 ...

  6. java求婚代码_屌丝程序员的求婚道具--内含视频

    身为程序员,求婚的方式,来点和程序相关的,是不是更有意思点呢? ###前言### 于是,从10月份,我就开始策划,要如何把这个求婚方案做完整了.我期望的求婚产生的效果如下: 浪漫 能提现我的技术本身又 ...

  7. html5网页制作代码_好程序员HTML5大前端常用开发工具大集合

    好程序员HTML5大前端分享常用开发工具大集合HTML5作为当前最为流行的编程语言,广为适用.语言的使用人数急剧增长,更多地开发人员使用这种语言来创建各种内容并放到互联网上.随着每一个新版本的发布,H ...

  8. 按照姓名升序排序的代码_好程序员Java培训分享Java集合的两种排序方法

    好程序员Java培训分享Java集合的两种排序方法,Java集合的工具类Collections中提供了两种排序的方法,分别是: 1.Collections.sort(List list) 2.Coll ...

  9. 可以进行单元测试么_为什么程序员都讨厌写单元测试?有一个词叫“相爱相杀”!...

    面对现实吧!没有人真的喜欢做单元测试.有很多人向我讲述他们超级讨厌单元测试.尽管有些人擅长于此,但对于我们大多数人而言,不管有多少抱怨.多少反感,单元测试都是一件必不可少的事情.今天,我将探讨为什么我 ...

最新文章

  1. idea设置类注释和方法注释
  2. python绘制动态模拟图-如何利用Python动态模拟太阳系运转
  3. leetcode算法题--有序数组中的单一元素
  4. Java03-day03【switch、循环(for、while、do...while)、三种循环的区别、跳转控制语句、Random、循环经典例题】
  5. redis部署与卸载
  6. 再聊机器人设计:如何加速开发流程?
  7. C语言中指针的地址和内容
  8. python中的numpy函数算相关系数_NumPy ufunc通用函数
  9. String+char+byte+ascii+unicode
  10. 索引、视图和同义词、序列
  11. EndNote导出毕业论文格式的参考文献
  12. smart原则_目标管理:OKR与SMART原则的异同
  13. linux bzip2 压缩目录,linux的gzip、bzip2、xz三种压缩使用方法工具介绍
  14. C++覆盖(override)
  15. android基础的博客,【复习】Android基础
  16. matlab求级数求和,实验七_matlab求解级数有关计算
  17. *.axf: Error: L6218E: Undefined symbol xxx(xxx.o)问题解决与inline函数的声明
  18. IDEA中Translation插件无法使用怎么办?
  19. 【Distributed】分布式任务调度平台
  20. mysql的decimal保留两位小数_C#中的decimal怎么保留两位小数

热门文章

  1. WPF Logical Tree vs. Visual Tree
  2. 5月7日MySQL 学习
  3. java中常忽视的小问题
  4. (笔记)VC6插件安装(VC6LineNumberAddin)
  5. 今天中午的时候,可能是自己太忙过头了,所以出现了拿错卡去充值
  6. iphone 原型工具
  7. 最常见的Web服务器市场份额
  8. spring集成compass中出现的问题和总结
  9. Delphi 与 DirectX 之 DelphiX(47): TDIB.DoContrast();
  10. 十大经典排序算法6(Python版本)