C语言回炉之 基本数据类型
数据类型关键字
数据类型关键字 | 标准 | 说明 |
---|---|---|
char | K&R | 字符型(c语言中是最小的整形处理) |
short | K&R | 短整形 |
int | K&R | 整形 |
long | K&R | 长型 |
unsighed | K&R | 无符号 |
float | K&R | 浮点数 |
double | K&R | 双精度浮点数 |
signed | C90 | 有符号的 |
void | C90 | 空 |
_Bool | C99 | 布尔值 |
_Complex | C99 | 复数 |
_Imaginary | C99 | 虚数‘ |
修饰整数类型
C语言提供了3个附属关键字修饰基本整数类型:short
,long
,unsigned
。至少应该知道以下几点:
short int
类型(等同short
)占用的存储空间可能比int
类型少,常用于较小数值的场合以节省空间。与int
类似,short
默认都是有符号类型。long int
类型(等同long
)占用的存储空间可能比int
多,使用于数值较大的场合。 与int
类似,long
默认都是有符号类型。long long int
或long long
(C99标准加入)占用的存储空间可能比long
大,适用于更大的数值场合。该类型至少占用64位。与int
类似,long long
默认都是有符号类型。unsigned int
或unsigned
只能用于非负数场合,这种类型与有符号类型表示的范围不同。例如,16位的unsigned int
允许的取值范围是0~65535,而不是-32768~32768.用于表示正负号的位现在用于表示另一个二进制位。所以无符号类型可以表示更大的数。- 在C90的标准中。又添加了
unsgined long int
或unsigned long
和unsigned int
和unsigned short
.C99标准又添加了unsigned long long int
或unsigned long long
. - 在任何有符号的类型前面加关键字
signed
,可以强调使用有符号类型的意图(当然,不加也可以)。例如short
,short int
和signed short
,signed short int
都是一样。
printf数据类型占位符
占位符 | 类型 |
---|---|
%d | int |
%h | short |
%l | long |
%c | char |
占位符后面加d
,o
,x
,u
分别对应十进制,八进制,十六进制,无符号。默认十进制(省略d
)。例如:
占位符 | 类型 |
---|---|
%ho | 八进制short |
%hx | 十六进制short |
%llx | 十六进制long long |
%llu | 无符号 long long |
_Bool类型
C99标准添加了_Bool
类型,用于表示布尔值,即逻辑值true
,false
。因为C语言用值1表示true
,用0 表示false
,所以实际上_Bool
也是一种整数类型。但原则上值占用1位存储空间,因为1和0对应,1位的存储空间够用了。
可移植类型stdint.h 和 inttypes.h
C99 新增了2个头文件stdint.h 和 inttypes.h以确保C语言的类型在各系统中的功能一致。C语言为现有类型创建更多类型名,这些新的类型名定义在stdint.h头文件中,例如int32_t
表示32位有符号整数类型。在使用32位的int系统中,头文件会把int32_t
作为int的别名。不同的系统也可以定义相同的类型名。例如int为16位,long为32位的系统会把int32_t
作为long的别名。然后使用int32_t
编写的程序并且包含stdint.h头文件时,编译器会把int或long替换位与当前系统匹配的类型。
浮点数
C语言的浮点数类型有float
,double
,long double
类型。
float
C标准规定,float类型至少需要表示6位有效数字,且取值范围至少在10-37~1037。前一项的规定指的是float类型必须至少精确表示小数点后的6位有效数字,如33.333333。后一项规定用于方便的表示存储太阳的质量(2.0e32),一个质子的电荷量(1.6e-19库伦)或国家债务之类的数字,通常系统存储一个浮点数要占用32位。其中8位用于表示指数的值和符号,剩下的24位用于表示非指数部分(也叫做尾数或有效数)及其符号。
double
C语言提供的另一种浮点数类型是double(意味双精度)。double类型和float类型的最小取值范围相同,但至少必须能够表示10位有效数字。一般情况下,double占用64位而不是32位。一些系统将多出来的全部用来表示非指数部分,这不仅增加了有效数字的位数(即提高了精度)。而且还减少了舍入误差。另一些系统把其中的一些位分配给指数部分,以容纳更大的指数,从而增加了可表述数的范围,无论那种方法,doubl都至少有13位有效数字,超过了标准的最低位数规定。
long double
C语言的第三种浮点类型是long double,以满足比double类型更高的精度要求,不过C值保证long double 至少与double保持相同的精度。
复数和虚数类型
C99标准类型支持复数类型和虚数类型,但是有所保留。C11标准把整个复数软件包都作为可选项。
C语言有3中复数类型:float _Complex
,double _Complex
和 long double _Complex
。例如float _Complex
类型的变量应该包含2各float类型的值,分别表示复数的实部和虚部。类似地,C语言的3钟虚数类型分别为float _Imaginary
,double _Imaginary
和long double _Imaginary
。
案例demo
#include<stdio.h>
int main(void){
const int price = 1700;
const double turn = 14.5833;
char c= 'C';
float weight,value;
int x=10,y=100;
short b=12;
unsigned long long ago =111111111111;
printf("你是否知道你的体重转换为白金的价格?\n");
printf("让我们一起来计算一下你的白金价格\n");
printf("请告诉我们你的体重(磅)\n");
scanf("%f",&weight);
value = price * weight * turn;
printf("您的体重转换为白金价格为%.2f \n",value);
printf("请按Enter退出体重白金价格计算.\n");
printf(getchar()+"\n");
printf("dec=%d ;octal = %o ; hex = %x ;\n",x,x,x);
printf("dec=%d ;octal = %#o ; hex = %#x ;\n",x,x,x);
printf("dec short Example %hd \n",b);
printf("octal short Example %hx \n",b);
printf("hex short Example %ho \n",b);
printf("在%llu之前\n",ago);
printf("字符对应整数 %d",c);
/*C99 为类型大小提供%zd转换说明*/
printf("Type int has a size of %zd bytes.\n", sizeof(int));
printf("Type long has a size of %zd bytes.\n", sizeof(long));
printf("Type short has a size of %zd bytes.\n", sizeof(short));
printf("Type char has a size of %zd bytes.\n", sizeof(char));
printf("Type long long has a size of %zd bytes.\n", sizeof(long long));
printf("Type float has a size of %zd bytes.\n", sizeof(float));
printf("Type double has a size of %zd bytes.\n", sizeof(double));
printf("Type long double has a size of %zd bytes.\n", sizeof(long double));
return 0;
}