C 基本数据类型
C数据可以从两方面宽泛的看:一、变量和常量;二、数据类型
从定义出发,变量和常量的区别是:变量在程序过程中数值是可以发生变化的,常量则是程序过程中维持不变的数值,程序结束后则释放变量常量存储空间。
数据除了变量和常量的区别之外,各个数据类型也有不同。不同的数据类型规定了变量常量被分配多少存储空间。变量通过声明语句来指定其类型;常量,编译器通过其书写来辨别其数据类型,确定类型则分配不同的空间范围。
基本数据类型:
char、 short、 unsigned short、 int、 unsigned、 long、 unsigned long、 long long、 unsigned long long、 float、 double、 long double、 _Bool(表示布尔值)、 _Comples(复数)、 _Imaginary(虚数)
按照计算机存储方式可以将上面数据划分成两个系列:整数(integer)类型和浮点数(float-point)类型
整数类型以二进制形式存储;浮点数类型存储分成两部分:小数部分和指数部分,并分别存储(浮点数类型要么有小数点,要么有指数部分,或者两者都有,二者不能同时省略)
当然无论整数类型还是浮点数类型在计算机中都是0和1,即二进制(整数类型和浮点数类型还有一个最大的区别:浮点数类型计算比整数类型慢,但是浮点数表示的数值比整数大的多)
short、int 、 long、long long都是有符号类型,即可写成: signed short、 signed int 、 signed long 、 signed long long。同样的类推,对应的无符号类型为:unsigned short、 unsigned int 、 unsigned long 、 unsigned long long
C规定int类型最小范围是-32768到32767,具体int类型范围需要根据实现来判断,32位的int值,64位的int值。。。。。
同时C规定了数值范围 short <= int <= long <= long long(意思就是C只保证short类型不会长于int类型,long类型不会比int类型短,同时C规定了最小范围,但不规定具体确定的范围,比如就不会规定int类型必须是-32767到32767之间的值)
按照分配空间范围依次为 char(C90标准允许signed char、unsigned char) -----> short -----> unsigned short -----> int -----> unsigned int(可以省略int) -----> long -----> unsigned long -----> long long(C99标准引入) ------> unsigned long long
这里在选择数据类型的时候,需要考虑移植问题。
char类型
char类型用于存储字母和标点符号之类的字符,但是本质上char却是用int类型处理。同时计算机存储都是0和1,那么字符是怎么存储进去的?为了处理字符,计算机使用了一种数字编码,将特定的整数表示特定的字符。以ASCII为例,字符变量itable存储的值为65,当用函数print打印出来时,可以使用格式说明符%c,那么屏幕上就会打印A,而不是数值65;当然如果使用%d,则打印出来的依然是65,这里就涉及printf函数的格式说明符的本质了,格式说明符只是将硬盘存储的数值以规定的方式显示到标准输出(说的直白点,char类型存储的是int类型值,但是解释成字符,这中间需要如果将int类型值解释成字符呢?通过编码转换,编码并不是只有ASCII一种,不同的编码数值65并不一定表示字符A)
char itable = 'B' 意味着‘B’作为数值66存储在一个32位单元中,而后赋值后的itable则把66存储在一个8位单元中,这就是char作为整数类型处理,会截取存储到8位单元中(假设int类型为8位,char类型为8位)
非打印字符:
\a 警报
\b 退格 活动位置在当前行上退回一个空格
\f 走纸 将活动位置移到下一页的开始处
\n 换行 活动位置移到下一行的开始处
\r 回车 活动位置移到当前行的开始处
\t 水平制表符
\v 垂直制表符
\\ 反斜杠
\' 单引号
\'' 双引号
\? 问号
指定常量数据类型
既然可以将一个较小值声明为较大范围的变量类型,那么是否可以将较小的常量值指定为较大范围的数据类型?
当我们在使用常量时,2345使用int类型,数值99999超过int类型时,编译器会自动选择long类型,当然我们可以在2345后加上后缀u,让编译器分配unsigned 大小的空间存储2345.
后缀u或者U用于标识unsigned类型;后缀l或者L用于标识long类型;后缀Lu、lu、LU、Ul用于标识unsigned long类型;后缀ll或者LL用于标识long long类型;后缀llu或者LLu标识unsigned long long类型,
接着使用后缀f或者F标识float类型,后缀l(小写L)或者L标识long double类型,默认情况编译器将浮点数常量当做double类型处理(这里long类型和long double类型后缀是一样,区别在于整数类型和浮点数类型,因为浮点数类型要么有小数点要么有指数部分,如果L紧跟在带有小数或者指数数值后面,则表示long double类型)
所以2345u表示unsigned类型;2345L表示long类型;2345LLU表示unsigned long long类型,2345.00L表示long double类型。。。。。。
printf()格式说明符和要显示的值得数目要相同
int ten = 10;
int two=2;
printf("%d minus %d is %d\n", ten, 2, ten-two);
printf("%d minus %d is %d\n", ten)
输出:
10 iminus 2 is 8
10 minus 10 is 2
第二个printf()中第一个%d打印对应的ten,接着第二、三个%d会获取内存中的任意位置数值。
数据溢出
int类型假设范围为-32767到32767,那么当int变量a=32767 + 1时,因为数据溢出,导致可能a + 1 = -32767,这种现象只是比较有代表性,也可能出现其他现象
END
浙公网安备 33010602011771号