c语言中的基本数据类型

时间:2023-02-11 17:24:45

c语言中的数据类型关键字:

K&R:   int   long   short   unsigned   char   float   double   
C90: signed void
C99: _Bool(布尔类型) _Complex(复数类型) _Imaginary(虚数类型)

数据类型按计算机的存储方式可分为两大基本类型:整数类型和浮点数类型。对计算机而言,他们的区别就是在机器内的存储方式不同。

整数: 就是整数。
浮点数: 就是小数。

计算机存储整数是按照二进制数字来存储的,而存储浮点数是将他分成小数部分和指数部分来分开存储的。因此,即使整数1和浮点数1.00在数值上是相同的,但是他们在计算机内的存储方式完全不同。
两种类型的区别:
1、整数就是整数,没有小数部分。而浮点数有小数部分。
2、浮点数能表示的数的范围要比整数大。
3、对于一些算术运算来讲,浮点数损失的精度更多。
4、因为在一个一定的区间内,整数数量是有限的,但是浮点数的数量是无穷的,因此浮点数的存储更多的只能是实际值的近似值,一般不等于其实际值。

int类型:

int类型是有符号整形,他可以表示其范围内的所有整数,如-1,0,1等,int的取指范围因计算机系统而异。存储一个int值需要一个机器子长,因此,早期的16位机存储int的机器子长为16位,也就是两个字节,其能表示的范围就是2^16(65536),但是int是有符号整形,所以他的最高位是被符号位占用,因此实际int能表示的整形的范围是-32768~32767。那么对于32位的计算机来讲,一个int类型最多就能存放4个字节,32位。ISO C规定了int的取值范围最小是-32768~32767。对于64位机,一般也把int所占空间大小视为4个字节。

short int 类型:
short int类型简写为short,他占用的存储空间可能比int类型小,short int类型占用两个字节(16位),常用于比较小的整数存放,以节省空间。(-32768~32767);

long int 类型:
long int类型简写为long,他占用的存储空间可能比int类型大,long int类型占用四个字节(32位),常用于比较大的整数存放。(-2^31-1~2^31);

long long int 类型:
long long int 类型简写为long long(C99标准加入),他占用的存储空间比long要多,占用8个字节(64位),可用于很大的整数存放。(-2^63-1~2^63);

unsigned int 类型:
unsigned int类型简写unsigned,用于非负整数的场合,unsigned int是无符号整形,他没有符号位,因此只能表示正整数,但由于他失去了符号位,因此比int类型要能多存更多整数。(0~65535);

C90标准中还添加了unsigned long int类型,unsigned short int类型。
C99标准中还添加了unsigned long long int 类型。
同理,以上三中类型都是五符号整形,它们能表示发的范围要比有符号整形表示的范围大。
c语言还提供的signed int 等类型,signed int类型表示有符号整形,表示强调带符号,但是他与int类型是一样的,int类型默认就是有符号整形。

对于short int, int, long int, 我们说short int可能比int类型占用的空间少,long int类型可能比int类型占用的空间多,为什么这么说呢?因为这里int类型是不确定的,他可能是16位的,可能是32位的,C语言只规定了short类型占用的空间不能多于int,long类型占用的空间不能少于int,所以short类型默认是16位的,long类型默认是32位的,但是int却无法确定,int类型的取值是根据计算机系统结构和编译器来决定的,或16位或32位。

char 类型:

char 类型用于储存字符,代表着字符类型,比如字母,标点符号,空格等。但是char类型实际上存储的是整数类型而不是字符类型,计算机是使用字符编码来处理字符数据的,char字符使用的编码方式是ASCII编码,ASCII编码中,每一个数字都代表这一个相应的字符。标准ASCII码的范围是0~127,所以我们需要8位数据来表示ASCII码以表示相应的字符数据,因此,一个char类型的数据需要占用一个字节(8位)。
有趣的是,c语言将char类型视为int类型存储,但是char类型是8位,int类型是16位或32位,因此char类型占用的空间就很少,必要的时候,我们就可以采用这种投机取巧的方法来优化内存(当然不建议用)。
在ASCII码表中,有些字符是打印不出来的,比如换行符,制表符,退格符等,但是c语言中可以采用转义字符解决这个问题。

转义序列:
\a 警报
\b 退格
\f 换页
\n 换行
\r 回车
\t 水平制表
\v 垂直制表
\ 反斜杠 “\”
\’ 单引号 “‘ ”
\” 双引号 ”
\? 问号 “?”
\0oo 八进制值
\xhh 16进制值

其中警报只打印警报,不对光标进行移动。
换行符把光标移到下一行的开始处
回车符把光标移到这一行的开始处

有些编译器把char解释成有符号类型,这表示char能表示的范围是-127~128,但也有编译器将char解释为无符号了类型,此时char能表示的范围是0~255。

_Bool类型:

C99标准添加了_Bool类型,用于表示布尔值,即逻辑上的true和false,因为c语言用1和0来分别代表true和false,所以 _Bool类型实际上也是一种整数类型,但是原则上它只占有一位存储空间,因为对0和1来讲,一位空间足够了。
_Bool类型的使用要包含“stdbool.h”的头文件。

浮点类型:

c语言中的浮点类型有float,double和long double 类型,浮点数能表示包括小数在内更大的数,他的表示类似于科学计数法。
float:
c标准规定,float类型的浮点数至少能表示六位有效数字,取值范围是10^(-37)~10^(37), 这个取指范围是为了更方便的表示大数据数字。上面已经提到了,浮点数在计算机中的存储是由小数部分和指数部分组成的,通常一个计算机系统用32位来存储float类型的浮点数,其中8位用来表示指数的值和符号,剩下的24位用来表示非指数部分和他的符号。
C语言的另一种浮点表示类型是double(双精度浮点数),double类型的最小取指范围和float类型相同,但是他必须至少能表示10位有效数字,一般情况下,double占64位的存储空间。一些系统为了增加有效数字的位数(提高精度),减少舍入误差,把多出来的32位分配给了double浮点数的非指数部分。还有一些系统为了容纳更大的数字,把多出来的位数分配给了指数部分,但无论哪种方法,double至少都有13位有效数字,超过了标准最低位数规定。
long double 比double类型的精度还要更高。
默认情况下,编译器都假定浮点类型的常量是double类型的精度。例如:
float ans;
ans = 1.0 * 2.0;
此时由于ans定义成了float类型,但是1.0和2.0是浮点型常量,因此他们被编译器编译成了double类型,因为double类型的数据时64位的,所以ans的数据其实是两个double类型的数据相乘,将最后的64位数据截断成32位(float类型)数据赋值给ans的。这样做计算精度很高,但是会程序的运行速度。
我们通常在浮点数的后面加上f或l代表他是float类型的数据还是double类型的数据。
float ans;
ans = 2.4f + 4.3l ;
其中2.4就是float类型的数据,4.3就是double类型的数据(当然这样写是不对的,数据类型应该对应匹配,这里只是为了理解)。没有f或l后缀的浮点数据都默认是double类型。

浮点数的上溢和下溢:
所谓上溢,就是指要计算的浮点数据大于当前浮点数据类型所能表示的最大范围所产生的数据溢出。
所谓下溢,就是指要计算的浮点数据由于计算丢掉了原末尾有效的数字。我们知道,浮点数据在计算机中是以小数部分和指数部分存储的,当我有一个数,他的指数部分是最小值,该数字是float类型能够表示的最小浮点数值,现在将这个数字除以2,一般这个操作会减少指数部分,但是在这种情况中,指数部分已经是最小值了,所以计算机只能把尾数向右移,空出一个二进制位,丢弃最后一个二进制数据。这种情况就叫下溢。
上溢和下溢都会对数据产生误差,所以我们在编写程序的过程中一定要掌握好数据的取值范围,避免出现上溢或下溢的情况。

字符串类型:

C语言中的字符串类型,其实就是char类型的数组。我们知道char类型是C语言中的字符类型,那么字符串就是由多个字符组成的。多个单字符组在一起构成了一个字符串。

C语言中的标准输入输出:

C语言中,从键盘读入是使用函数scanf();
例如:从键盘读入一个int类型的数据10;

    int n;
scanf("%d", &n);

int m,n;
scanf("%d %d", &m, &n);

scanf()函数接收两类参数,其中,%d表示输入数据的类型,&是取地址符。这两类参数可以不只有一种,但是两类参数数量必须一一对应(有几个%d,就得有几个变量)。scanf()函数返回值是能够正确读取数据的个数。这段代码的意思就是:声明一个变量n,我从键盘读入一个int类型的数据,将这个数据送入到变量n的地址里面去。%d就是指数据类型,如果是float类型的数据就用%f,double类型的数据用%lf,char类型的数据用%c。字符串类型的输入是%s,但是这时是没有&符号的。

    char str[10];
scanf("%s", str);

输入字符串时,str就是字符串的首地址,所以不需要&(取地址符)。

C语言中的输出函数是printf(),此函数用于把数据输出到窗口。printf()函数的返回值是输出字符的个数,若出错,则返回负数。printf()函数也接受两种类型的参数,和scanf()一样。

int n = 10;
printf("%d\n", n);

char m = 'a';
char n = 'b';
printf("%c %c\n", m,n);

其中%d和%c表示输出数据的类型,\n表示输出换行,m,n表示变量,只不过输出的时候不在使用&取地址符了。
注意:数据定义类型和输入输出类型必须正确,否则数据的计算将不准确,如果你要将一个float类型的数据强制转化为int类型的数据输出,编译器便会强制截掉小数部分,不会进行四舍五入。

细节:

计算机中的整数和浮点数本质上就不同,存储方式更是千差万别,所以即使同是32位数据float和long类型,他们表示的数据不一样。C语言允许写混合数据的表达式,但是他会进行自动类型转换,造成数据的不确定性,所以,我们应该注意每一种数据的类型,最好亲自去为数据进行强制转化。