C语言基本数据类型

概述

一门编程语言对于类型系统的设计在很大程度上决定了这门语言的抽象能力及其适用的领域。C是一门面向底层的编程语言,它所支持的数据类型大都是直接基于内存进行的抽象,这也使得C语言具备了很强的与底层交互的能力。因此要理解C语言的类型系统,很多时候我们都需要站在硬件和内存的角度进行思考。C语言支持的数据类型如下图所示:
-w522
本文关注于C语言中的基本数据类型。

整型数

C语言提供了char、short、int以及long三种不同长度的整型数,并根据数据的表示是否带有符号位,又进一步区分为无符号整型数和有符号整型数。

整型数的大小

C语言提供了三种不同长度的整数:short、int和long型,但是却没有明确定义这三种整型数的长度。ANSI标准要求long型整数的长度至少应该是32位,short型和int型整数的长度至少应该是16位,而实际的长度需要根据程序运行的硬件平台来确定,一般来说:

  • 16位硬件下:short和int为16位长度,long为32位长度;
  • 32位硬件下:short为16位长度,int和long为32位长度;
  • 64位硬件下:short为16位长度,int为32位长度,long则扩展至64位长度。

固定长度整型数

没有固定长度数据类型是现代C语言的一个不完美的地方,后续C99标准,通过增加stdint.hinttypes.h头文件,提供了明确长度的数据类型,从而稍稍弥补了这一不足。C99新增的固定长度数据类型罗列如下:

  • 8位整型数:int8_t/uint8_t;
  • 16位整型数:int16_t/uint16_t;
  • 32位整型数:int32_t/uint32_t;
  • 64位整型数:int64_t/uint64_t。

字符类型

C语言提供了单独的关键字char来表示字符类型,但是从技术实现来说,字符类型本质还是整型数,只是在逻辑上了根据字符编码表做了一层转换。C语言在设计之初,仅支持ASCII编码标准字符,这是一个7位的编码标准,使用8位长度的整数即可容纳,因此C语言中的字符在大多数现代编译器中都被实现为8位整型数。

字符是有符号还是无符号

由于ANSI字符标准定义的字符范围是0-127,因此无论使用8位的无符号数或者有符号数都足以容纳这个范围,并且C语言标准也没有约束要使用哪种方式,因此具体行为也就取决于各种编译器的实现了。常见的编译器对字符类型的表示规定如下:

  • VC编译器:规定char为signed char类型;
  • GCC编译器:x86体系下,规定char为signed char类型;ARM体系下规定char为unsigned char类型。

8位整型数

在此需要特别说明的是,C语言并没有像Java那样为8位长度的整型数定义单独的关键字,因此我们只能使用字符类型char来表示。虽然意义稍有不合,却也别无他法,毕竟从数据表示的角度来说,这并没有任何差异。但是个人在此的建议是在使用时要区分char和unsigned char这两种类型:

  • 当在具有明确字符含义的场景下,如字符串操作,使用char类型;
  • 在涉及单纯内存数据操作时,如内存拷贝,由于内存存储的字节本身没有正负的概念,可使用unsigned char类型进行表示。

void类型

void定义为空类型,一般来说是无法在程序里定义一个void类型的变量,即使可以,也毫无意义。void比较常见的两种用法:

  • 一种是定义“void *”类型的指针,这种类型的指针可以指向任何类型的数据,同时也可以转换为其它明确类型的指针;
  • 另一种是对函数的修饰,用于表明函数返回空类型或者函数不接受任何参数。

相关参考

  • 《C语言深度剖析》
  • 《深入理解计算机系统》
posted @ 2020-03-22 18:09  Aspiresky  阅读(83)  评论(0)    收藏  举报