「C」- 数据类型

数据类型的关键字

K&R				C90			C99
---------------------------------------
int				signed		_Bool
long			void		_Complex
short						_Imaginary
unsigned
char
float
double

int:整数类型;
long、short、unsigned、signed:提供基本整数类型的变形:unsigned long int、long long int;
char:字母、字符、较小的整数;
float、double:带小数点的数;long double;
_Bool:布尔值 ⇒ C99
_Complex:复数;
_Imaginary:虚数;

浮点类型:
在计算机内,浮点数被分为 小数部分 和 指数部分 来表示,并分开存储这两部分,使用二进制和 2 的幂进行存储。

int,有符号整型

// 声明
int erns;
int hogs, cows, goats;

// 赋值
cows  = 5;
goats = 0x20;                // 十六进制赋值,0x20 = 32
erns  = 020;                 // 八进制赋值,020 = 16
scanf("%d", &hogs);
int hen, dogs = 3;           // 变量初始化能够在声明中直接完成
                             // 但是,这里仅初始化 dogs 变量

// 打印
printf("%d", dogs);          // 打印整数
                             // %d, %o, %x:分别以 十进制,八进制,十六进制 打印;
                             // %#o, %#x, %#X:添加 0、0x、0X 的八进制或十六进制前缀;

其他整数类型:
1)short int
2)long int / long
3)long long int / long long ⇒ C99
4)unsigned int / unsigned
5)unsigned long int / unsigned long / unsigned int / unsigned short ⇒ C90
6)unsigned long long int / unsigned long long ⇒ C99
7)signed,用于强调使用有符号类型;

整数类型的大小取决于编译器(鉴于 C 标准只规定最小大小):
1)int:2 Byte 或 4 Byte;
2)short:2 Byte;
3)long:4 Byte(for 32-bit OS)或 8 Byte;

long 类型常量:
1)使用 l/L 后缀来表示为 long 类型:30l / 30L
2)使用 ll/LL 后缀来表示为 long long 类型:30ll / 30LL
3)使用 u/U 后缀来表示 unsigned long long 类型:30LLU / 30ULL

数值打印(printf):

%u		unsigned int
%d		int;如果 long 与 int 等长,则也可使用 %d 来打印;

%ld		long
%lo		以八进制打印 long 类型;
%lx		以十六进制打印 long 类型;

%hd		以十进制打印 short 类型;
%ho		以八进制打印 short 类型;

%lu		unsigned long
%lld	signed long long
%llu    unsigned long long

char,字符类型

// 声明

char response;
char itable, latan, unprintable;

// 赋值

laten = 'A';
response = 65;               // 最然语法正确,但是这是不好的实践方法

unprintable = 7;             // 传递非打印字符的方法
unprintable = '\n';
unprintable = '\007';
unprintable = '\x10';

// 打印

printf("%d", dogs);          // 打印整数
                             // %d, %o, %x:分别以 十进制,八进制,十六进制 打印;
                             // %#o, %#x, %#X:添加 0、0x、0X 的八进制或十六进制前缀;

字符打印(printf):

%c

_Bool,布尔类型

true / false

在 C 中,1 为 true,0 为 false,所以 _Bool 也为整数类型,但原则上仅占用 1-bit 存储空间;

float,double,long double

// 声明

float noah, jonah;
double trouble;
float planck = 6.63e-24;

// 赋值

trouble = 6.73e-4
.8E-5                             // 编译器默认是 double 类型
2.35f                             // f/F:float 类型
4.32L                             // l/L:long double 类型
0xa.1fp10                         // 十六进制表示法,p10 = 2^10
                                  // = (10 + 1/15 + 15/256) * 2^10 = 10364.0

// 打印

%f,打印 float double 类型
%e,以指数计数法打印

float

标准规定,float 必须至少能表示 6 位有效数字,取值范围至少是 10^{-37} – 10+37

通常,系统存储浮点数需要占用 32 位:8 位用于存储指数与符号,剩下而 24 表示非指数部分(尾数/有效数)及符号。

double

64 位

部分系统将超出的部分全部用来存储非指数部分,得以提高精度,同时减少舍入而导致的误差。
还有部分系统把其中一些位分给指数位,以容纳更大的指数,从而增加可表示数的范围。
无论那种方法,double 类型都保证至少由 13 位有效数字,都超过标准要求的最低位数;

long double

取决于实现,但能保证至少与 double 类型精度相同。

可移植类型(stdint.h,inttypes.h)

为保证类型在各系统中的功能相同,C99 新增 stdint.h 和 inttype.h 两个头文件。

精确宽度整数类型(exct-width interger type):
1)int32_t,表示 32-bit 有符号整数类型;

最小宽度类型(minimum width type):
1)int_least8_t

最快最小宽度类型(fast minimum width type):
1)int_fast8_t

关于打印,字符串宏用于打印可移植类型:

#include <inttypes.h>
...
printf("me32 = %" PRid32 "\n", me32);