linux c函数库参考手册(LinuxC编程)
linux c函数库参考手册(LinuxC编程)C 标准规定的浮点型有float double long double 和整型一样,既没有规定每种类型占多少字节,也没有规定采用哪种表示形式。浮点数的实现在各种平台上差异很大。整数常量还可以在末尾加u或U 表示“unsigned”, 加I或L表示"long", 加II 或LL表示"long long",例如0x1234U,987ULL等。但事实上u l ll这几种后缀和上面讲的unsigned long long long 关键字并不是一一对应的。除了char 型在C 标准中明确规定占一个字节之外,其它整型占几个字节都是implementation Defined。通常的编译器实现遵守ILP32或LP64规范,如下表所示:ILP32这个缩写的意思是int(I),long(L)和指针(P) 类型都占32位,通常32位计算机的C 编译器采用这种规范,
- 整型
在C 语言中char型占一个字节的存储空间,一个字节通常是8个bit。如果这8个bit 按无符号整数来解释,取值范围是0~255,如果按有符号整数来解释,取值范围是-128~127。
C 语言规定了signed 和 unsigned 两个关键字,unsigned char 类型表示无符号数,signed char类型表示有符号数。
注意,ASCII 码的取值范围是0~127,所以不管char 型是有符号的还是无符号的,存一个ASCII 码都没有问题,一般来说,如果用char 类型存ASCII码字符,就不必明确写signed还是unsigned。
除了char类型之外,整型还包括short int(或者简写为short), int,long int(或者简写为long),long long int (或者简写为long long)等几种,这些类型都可以加上signed或unsigned关键字表示有符号或无符号数。
除了char 型在C 标准中明确规定占一个字节之外,其它整型占几个字节都是implementation Defined。通常的编译器实现遵守ILP32或LP64规范,如下表所示:
ILP32这个缩写的意思是int(I),long(L)和指针(P) 类型都占32位,通常32位计算机的C 编译器采用这种规范,x86平台的gcc也是如此。LP64是指long(L) 和指针占64位,通常64位计算机的C 编译器采用这种规范。指针类型的长度总是和计算机的位数一致。
在C语言中也可以用八进制和十六进制的整型常量,八进制整数常量以0开头,后面的数字只能是0~7,例如022,因此十进制的整数常量就不能以0开头了,否则无法和八进制区分。十六进制整数常量是0x 或 0X开头,后面的数字可以是0~9,a~f和A~F。
整数常量还可以在末尾加u或U 表示“unsigned”, 加I或L表示"long", 加II 或LL表示"long long",例如0x1234U,987ULL等。但事实上u l ll这几种后缀和上面讲的unsigned long long long 关键字并不是一一对应的。
- 浮点型
C 标准规定的浮点型有float double long double 和整型一样,既没有规定每种类型占多少字节,也没有规定采用哪种表示形式。浮点数的实现在各种平台上差异很大。
long double 型通常是比double型精度更高的类型,但各平台的实现有较大差异。但x86平台上,大多数编译器实现的long double是80位。
- 类型转换
算术运算中的类型转换。有符号或无符号的char 型,short 型和Bit-field 在做算术运算之前首先要做Interger Promotion 然后才能参与计算。例如:
unsigned char c1 = 255;
unsigned char c2 = 2;
int n = c1 c2;
计算表达式c1 c2 的过程其实是先把c1和c2提升为int型然后再相加(unsigned char的取值范围是0~255,完全可以用int 表示,所以提升为int 就可以了, 不需要提升为unsigned int) 整个表达式的值也是int 型,最后的结果是257。假如没有这个提升的过程,c1 c2就溢出了,溢出会得到什么结果是Undefined。
如果赋值或初始化时等号两边的类型不相同。则编译器会把等号右边的类型转换成等号左边的类型再做赋值。例如int c = 3.14; 编译器会把右边的double型转换成 int 型再赋值给变量c。
在函数调用和返回过程中发生的类型转换往往容易被忽视,因为函数原型和函数调用并没有写在一起。例如char c = getchar(); 看到这一句往往会想当然地认为getchar 的返回值是char 型,而事实上getchar 的返回值是int 型,这样赋值会引起类型转换,可能产生Bug。
把一个M位的类型(值为X) 转换成N位的类型,所有可能的情况如下表所示: