DataType
概述
数据类型用于声明不同类型的变量或函数,变量的类型决定了变量存储占用的空间和变量存储的格式。
存储类型定义程序中变量/函数的范围(可见性)和生命周期。
数据类型包括基本类型、派生类型、枚举类型(enum)和空类型(void)。
- 基本类型
- 整型
- 浮点类型
- 派生类型
- 指针类型
- 数组类型
- 结构体类型(struct)
- 共用体类型(union)
- 函数类型
其中:
- 基本类型和枚举类型变量都是都是值,统称为算数类型;
- 算数类型和指针类型变量的值都是以数字表示的,统称为纯量类型;
- 数组类型和结构体类型统称为组合类型,共用体类型不属于组合类型因为同一时间只有一个值。
注意:
-
共用体类型与枚举类型的区别:
- 共用体类型是多变量共享存储空间的派生类型,其中的元素是变量;共用体空间等于最大成员变量占据的空间,共用体不能赋初值;
- 枚举类型是多常量共享存储空间的数据类型,其中的元素是常量;因此枚举类型变量的值定义时确定,可以全部列出;
-
声明时必须注意到C语言区分大小写!
整型
-
基本整型int
输出格式:十进制
%d
,八进制%o
或%#o
,十六进制%x
或%#x
;16位机器上2字节,32位机器上4字节,64位机器上4字节;
-
短整型short int
输出格式:十进制
%hd
,八进制%ho
或%#ho
,十六进制%hx
或%#hx
;简记为16位int,因此占2字节;
-
长整型long int
输出格式:十进制
%ld
,八进制%lo
或%#lo
,十六进制%lx
或%#lx;
简记为32位int,因此占4字节;
-
双长型long long int
输出格式:十进制
%ll
,八进制%llo
或%#llo
,十六进制%llx
或%#llx
;至少分配8个字节;
-
无符号数变体
当存在
unsigned
前缀且需要用十进制表示时用%u
替换%d
,其他时候均不变;
实型
利用浮点表示法表示实型数据。浮点表示法指的是小数点位置可以浮动,又称IEEE754标准。
实型表示
浮点数用数符、阶码(移码)和尾数(隐藏首位的原码)表示。
-
单精度浮点型float
输出格式:
%f
分配4个字节;
-
双精度浮点型double
输出格式:
%f
或%lf
或指数记数法%e
,十六进制%a
分配8个字节;
-
长双精度浮点型long double
输出格式:
%Lf
或指数记数法%Le
,十六进制%La
可能是8个字节,12字节,16字节;
实型运算
注意事项
-
输出宽度控制
- 可以用
%g
输出浮点数,系统自动选择f格式或e格式输出,自动选择长度较短的格式,不输出无意义的0。 - 可以用
%m.nf
指定数据宽度和小数位数,m表示浮点数所占的列数,n表示小数所占的位数。
- 可以用
-
浮点型常量写法
有符号数字(包括小数点)+e/E+有符号数字(指数)。
- 可以省略正号,可以省略小数点(2E5)或指数部分(19.28),但不能同时省略两者;
- 可以省略小数部分(3.E16)或整数部分(.45E-6),但不能同时省略两者。
不能在浮点型常量中加空格!
-
浮点型变量比较
不可将浮点变量用“==”或“!=”与任何数字比较!
而应该设法转化成两数相减后用“> =”或“ <=”形式,比较的数称为误差。
-
上溢与下溢
- 上溢时显示inf或infinity(无穷大)
- 下溢时损失精度(尾数的末尾被舍去)
字符型
定义
-
char或unsigned char
输出格式:
%c
分配1个字节,且该字节中第一位置为0。
-
char *类型
输出格式:
%s
分配N个字节(存储N个字符时)
概念区分
-
字符常量是用单括号括起来的一个字符;
-
字符串常量是用一对双括号括起来的零个或多个字符组成的字符序列,结尾不需要加’\0’。
-
字符数组是用一对大括号括起来的零个或多个字符组成的字符序列,结尾不需要加’\0’。
注意:
-
输出宽度控制
可以用
%md
进行右对齐;可以用
%ms
指定输出字符串占的列数,少则左补空格,多则突破限制;可以用
%m.ns
指定输出字符串占的列数及只取字符串左边n个字符输出在m列的右侧,左补空格。 -
使用整型输出格式可以输出字符型数据的ASCII码;
-
字符常量中,‘101’是八进制字符;‘x41’是十六进制字符;他们都指代ASCII码为65的字符,即A;
特别地,‘101’可写为'0101’,‘x41’可写为'0x41’;
-
字符串常量中,\101是八进制字符;\x41是十六进制字符;他们都指代ASCII码为65的字符,即A;
特别地,\101不可写为\0101,x41可写为\0x41;
赋值
char []
类型的变量只有在定义时可赋const char []
类型的初值,即字符串常量。
若需要为其赋值,可用strcpy()
,它位于string.h
头文件中。
数据类型判断
C语言中无判断数据类型的函数,可考虑使用sizeof
运算符进行占用存储空间的计算,见下面:
#include<stdio.h>
int main(){
printf("%d",sizeof(double));
printf("%d",sizeof(5/3.0));
}
C++中可以使用typeid()函数判断数据类型,见下面:
#include<stdio.h>
#include<typeinfo>
int main(){
printf("%s",typeid(double).name());
printf("%s",typeid(5/3.0).name());
}