C语言中的数据类型

写在前面:该文章内容转自wiki,介绍的非常清楚。

C语言中,数据类型可以分为两类:基础数据类型和复合数据类型。

目录

1 基础数据类型
2 复合数据类型
• 2.1结构
• 2.2联合
• 2.3枚举

1 基础数据类型

注意:以下是典型的数据位长和范围。编译器可能使用不同的数据位长和范围。请参考具体的参考手册。

在标准头文件limits.h 和 float.h中说明了基础数据的长度。float,double和long double的范围就是在IEEE_754标准中提及的典型数据。另外,C99添加了新的复数类型,C11添加了原子类型,它们不在本条目讨论范围内。

关键字字节(字节)范围格式化字符串硬件层面的类型备注
char1bytes通常为-128至127或0至255,与体系结构相关%c字节(Byte)大多数情况下即signed char; 在极少数1byte != 8bit或不使用ASCII字符集的机器类型上范围可能会更大或更小。其它类型同理。
unsigned char1bytes通常为0至255%c、%hhu字节
signed char1bytes通常为-128至127%c、%hhd、%hhi字节
int2bytes(16位系统) 或 4bytes-32768至32767或 -2147483648至2147483647%i、%d字(Word)或双字(Double Word)即signed int
unsigned int2bytes 或 4bytes0至65535 或 0至4294967295%u字或双字
signed int2bytes 或 4bytes-32768至32767 或 -2147483648至2147483647%i、%d字或双字
short int2bytes-32768至32767%hi、%hd大多数情况下即signed short
unsigned short2bytes0至65535%hu
signed short2bytes-32768至32767%hi、%hd
long int4bytes 或 8bytes[1]-2147483648至2147483647 或 -9223372036854775808至9223372036854775807%li、%ld长整数(Long Integer)即signed long
unsigned long4bytes 或 8bytes0至4294967295 或 0至18446744073709551615%lu整数(Unsigned Integer)或 长整数(Unsigned Long Integer)依赖于实现
signed long4bytes或 8bytes-2147483648至2147483647 或 -9223372036854775808至9223372036854775807%li、%ld整数(Signed Integer)或 长整数(Signed Long Integer)依赖于实现
long long8bytes-9223372036854775808至9223372036854775807%lli、%lld长整数(Long Integer)
unsigned long long8bytes0至18446744073709551615%llu长整数(Unsigned Long Integer)
float4bytes2.939x10−38至3.403x10+38 (7 sf)%f、%e、%g浮点数(Float)
double8bytes5.563x10−309至1.798x10+308 (15 sf)%lf、%e、%g双精度浮点型(Double Float)
long double10bytes或 16bytes7.065x10-9865至1.415x109864 (18 sf或33 sf)%lf、%le、%lg双精度浮点型(Double Float)在大多数平台上的实现与double相同,实现由编译器定义。
_Bool1byte0或1%i、%d布尔型(Boolean)

注:粗体为C99所新增的类型。

2. 复合数据类型

在C语言中,复合数据类型可分为三类:结构、联合和枚举。在现代C语言中,联合和枚举的使用频率已逐渐减少。

2.1 结构

  • 主条目:结构体 (C语言)

  • 结构(structure variable)允许构造由多个基础数据类型组合而成的复杂结构[2]。结构为面向对象编程的蓝本。以下示例通过结构和结构体里的指针实现了二叉树结构:

 typedef struct Bintree {
    int data;
    struct bintree lchild; // left child of the node
    struct bintree rchild; // right child of the node
  } bintree; // 自定义 bintree 类型
  #define mktree() (bintree *)malloc(sizeof(bintree)) // 分配该结构所需的内存单元数量
    bintree *tree;
    tree = mktree(); // 分配到 tree 指针
    tree->data = 1;
    tree->lchild = mktree();
    ...
  • 由于C语言不具备自动垃圾收集(Garbage Collection)功能,使用完毕后调用free(treePtr)来释放之前通过malloc(size)分配的内存。详见这里。 在C99标准中,还添加了名为伸缩型数组成员的特性[3],关于此特性的内容超出了该条目的介绍范围,若需了解更多信息可参见文档或其它材料。

2.2 联合

  • 主条目:联合体

  • **联合(union)**与结构相类似,但不同的是,联合在某一特定时刻只有最后被使用的成员的值是确定的,因此一个联合只使用所有成员中所占空间最大的成员所使用的内存。然而,一些编译器可以通过编译参数或#pragma的方式强制联合使用与所有成员所占储存空间的和相等的储存空间,在这种情况下,除最后被使用的成员外,其余成员的值是未定义的[4]。以下给出了联合的一个声明:

  union foo{
     int bar;
     double foobar;
  };
    
  foo.bar = 8;
  foo.foobar = 3.14;
  • 在这个例子中,假设使用32位平台编译,一个double变量占8字节,一个int变量占2字节(由上表得),则该联合所占大小即为double类型的大小——8字节。在这段程序执行完毕后,foo.bar的值是未定义的,而foo.foobar的值为3.14。

2.3 枚举

  • **枚举(enumerated type)**用来声明一组整数常量。默认情况下,枚举声明格式为enum type {value1,value2,…,valuen};此时value1,value2分别为0,1,直到n-1。事实上,枚举类型在C语言实现中是以int类型储存的[5]。以下是枚举的一个声明:
 enum a { b , c , d };
  • 在此之后,便可以以如下方式使用:
 enum a foo;
 foo = b;
 if(foo != c) //等同于if(foo != 1)
 {
   do_something();
 }
  • 而此时的b,c,d分别为0,1,2。 另外,也可以手动为枚举列表中的常量赋值。下面是一个例子:
 enum colour {red = 100,blue = 700,yellow = 200};
  • 则此时red,blue,yellow的值分别为100,700,200.

  • 需要注意的是,枚举在C和C++中所表现的行为有一些细微的差异。参见C与C++的兼容性

来自 <https://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B_(C%E8%AF%AD%E8%A8%80)>

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值