数据类型的关键字
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);