C语言-基本数据类型

C语言中有3种基本数据类型,分别是整型、字符型和实型(浮点型),下表列出的是32位平台数据类型的长度及其取值范围

类别 名称 类型名 数据长度 取值范围
整型 [有符号]整型 [signed] int 32位 -2147483648~2147483647(-2^31 ~ 2^31-1)
[有符号]短整型 [signed] short [int] 16位 -32768~32767(-2^15 ~ 2^15-1)
[有符号]长整型 [signed] long [int] 32位 -2147483648~2147483647(-2^31 ~ 2^31-1)
无符号整型 unsigned [int] 32位 0~4294967295(0 ~ 2^32-1)
无符号短整型 unsigned short [int] 16位 0~65535(0 ~ 2^16-1)
无符号长整型 unsigned long [int] 32位 0~4294967295(0 ~ 2^32-1)
字符型 [有符号]字符型 [signed] char 8位 -128~127(-2^7 ~ 2^7-1)
无符号字符型 [signed] char 8位 0~255(0 ~ 2^8-1)
实型(浮点型) 单精度浮点型 float 32位 约±(10^-38 ~ 10^38)
双精度浮点型 double 64位 约±(10^-308 ~ 10^308)
注:方括号中的内容可以省略,且一般都是省略的。

一、整型与整型常数(整数)

1、整型

整型是不存在小数的数据类型。在C语言中,为了处理不同取值范围的整数,提供了一些扩展的整数类型,它们是在int前加加入short、long或unsinged等限定词。
带有unsigned限定词的数据类型表示的是不带符号的整数,即0或正整数,不包括负数;若不带unsigned限定词则默认是表示有符号数,例如int表示的是有符号数,其中int前的signed一般都会省略。有符号的整型数据存储单元的最高位是符号位,其余的各位表示数值;存储无符号(即unsigned修饰)的整型数据时,存储单元全部用于表示数值,没有单独表示符号的位。
以short型和unsigned short型举例,假设它们都占用两个字节存储,short型的取值范围是[-32768, 32767],而unsigned short型数据的取值范围是[0, 65535]。
short型最大正数32767( 2 15 − 1 2^{15}-1 2151在这里插入图片描述unsigned short型最大正数65535( 2 16 − 1 2^{16}-1 2161
在这里插入图片描述
在C语言中,没有规定各类整型数据的长度,只要求short型不长于int型,long型不短与int型。一般来说数据所占用的存储单元和编译系统的位数相关,例如上表列出的与Dev-C++编译系统规定的一致,而Turbo C编译系统中,int和unsigned型数据的长度就只有16位。在编译器可以使用sizeof(int)等判断数据类型所占的存储字节。
C语言整型数据的扩展还有long long类型,一般来说32位编译系统long long类型所占存储单元是8个字节(64位)(long long类型可能在某些编译系统不支持)。

2、整型常量

直接写的整数就是整型常量,例如24就是个整型常量。合法的整型常量的值不应超过上表中整型数据的取值范围。
① 整数的表示
C语言中表示整数有十进制、八进制和十六进制三种形式。十进制由正、负号和阿拉伯数字0 ~ 9组成,但是首位数字不能是0。八进制整数由正、负号和阿拉伯数字0 ~ 7组成,首位数字必须是0。十六进制整数由正、负号和阿拉伯数字0 ~ 9、英文字符a ~ f或A ~ F组成,首位数字前必须有前缀0x或0X。不带符号默认为正数。
例如:10、010和0x10分别为十进制、八进制和十六进制整数,它们表示的是不同数值的整数。10是十进制数值,010的十进制数值是8,0x10的十进制数值是16;16、020和0X10分别为十进制、八进制和十六进制整数,它们表示同一个数值的整数,都表示十进制数值16。
0381、8a和0x2g这种表示是非法的,八进制不能出现比7大的数字,而十进制也不能出现字母,若表示十六进制前缀0x或0X不能省略,且不能出现g及以后的字母。
对于任何一个整数都可以采用三种形式表示,不会影响到它们的数值、计算和比较,它们只是整数数值的三种不同的表现形式而已。例如十进制的10可以表示成10、012或0xA。
②整数的类型
整数后可以加字母后缀表示整数的类型。后缀l或L表示的是long型常量,如-15L,01234567L;后缀ll或LL表示的是long long型常量,如-15ll;后缀u或U表示unsigned型常量,如15u,045u,0x3feU;后缀l和u或L和U表示unsigned long型常量,如4294967295LU。
如果整数后面没有字母后缀,那么如果数值范围在int的范围,则默认为int型,若超过int的范围则数据类型是可以存储该整型数据的更大的整型,例如在Dev-C++中则为long long型,sizeof(2147483648) = 8

二、字符型与字符型常量

1、字符型

字符型数据在内存中占用一个字节,用于存储它的ASCII码。C语言中的字符具有数值特征,它可以写成字符常量的形式,还能用其相应的ASCII码来表示,即用整数来表示字符,且可以使用其相应的ASCII码来计算、比较等。
例如:定义ch为字符变量,字符型常量A的ASCII码值是65,那么ch = 'A’和ch = 65是等价的。注意表示字符时单引号不能省略。
字符型变量和整型变量的值可以互换,但是超过字符型变量的取值范围的话就不能互换了,即在0~127它们可以表示相同的意义。

2、字符型常量

字符型常量是指单个字符,它用一对单引号及其所括起来的字符来表示的。如’a’、‘Z’、‘$’、’ ‘(空格符)等都是字符型常量。字符型常量需要注意的是’a’和’A’是不同的字符型常量,即C语言的字符型常量是区分大小写的;‘0’与0是不同类型的常量,‘0’表示字符型常量,其ASCII码是48,而0表示的是整型常量,它就是0。
①ASCII字符集
C语言使用的是ASCII字符集,C语言中字符可以当整数用,它们能用于比较、计算等。如果是单独的字符型常量,那么C语言中会默认当做int型数据来处理,存储它的ASCII码,即单个字符常量会占用4个字节(32位平台),C语言中字符常量与它所对应的ASCII码是等价的。ASCII码表参考:https://blog.csdn.net/passxgx/article/details/123793691?spm=1001.2014.3001.5501
例如:‘a’的ASCII码是97,‘a’+1=98,表示的就是字符’b’。英文字母的大写和小写是按照升序连续排列的,但是大小写字母并不连续,即’A’ ~ ‘Z’,‘a’ ~ ‘z’是连续升序排列的,但是’Z’与’a’并不连续;阿拉伯数字‘0‘~‘9‘也是连续升序排列,‘0’+1是字符’1’,但是’0’+‘1’是它们相应的ASCII码相加,即为48+49=97,这个表示的不是字符’1’,相应的字符应该是’a’。
②转义字符
转义字符是由反斜杠加上一个字符或数字组成的,它把反斜杠后面的字符或数字转换成别的意义。虽然转义字符形式上是由多个字符组成,但是它是字符常量,只代表一个字符,它的用法与其他字符常量相同。下表是常见的转义字符:

字符 含义 对应的ASCII码十进制 十六进制
\r 回车 13 0x0D
\n 换行 10 0x0A
\t 横向跳格(水平制表符) 9 0x09
\\ 反斜杠 92 0x5C
\" 双引号 34 0x22
\’ 单引号 39 0x27
\ddd 1~3位八进制整数所代表的的字符 - -
\xhh 1~2位十六进制整数所代表的的字符 - -

上表中最后两行采用的是ASCII码(八进制整数、十六进制整数)表示一个字符。例如,\102表示ASCII码是八进制数102的字符,即字母’B’;\x41表示ASCII码是十六进制数41的字符,即字母’A’。这样表示,ASCII字符集中的所有字符都可以用转义字符表示。

三、实型与实型常量(实数)

1、实型

实型又称浮点型,它是指带有小数部分的数。
浮点型数据有单精度浮点型(float)和双精度浮点型(double)两种,它们表示数值的方法是一样的,区别是数据的精度和取值范围不同。double型数据的精度更高,取值范围更大。
单精度浮点型数据在内存中占4个字节存储空间,即32位,其有效数字一般为7~8位,取值范围是 ± ( 1 0 − 38 ±(10^{-38} ±(1038 ~ 1 0 38 ) 10^{38}) 1038);双精度浮点型数据占8个字节,即64位,它的有效数字一般为15~16位,取值范围为 ± ( 1 0 − 308 ±(10^{-308} ±(10308 ~ 1 0 308 ) 10^{308}) 10308)。浮点型数据不存在有符号和无符号之分,在不同的编译系统所占用的存储空间是相同的。
浮点型数据的精度可能会出现变化。例如1234567.89虽说在单精度浮点数的取值范围内,但是它的有效数字超过了8位,如果该数赋值给单精度浮点型变量,其值就变成了1234567.80,最后一位成了一个随机数,损失了有效精度。注意:实数在计算机中只能近似表示,运算中也会产生误差,一般来说不能用于精确比较。

2、实型常量

实型常量即实数,又称浮点数。可以采用十进制浮点数表示法和科学计数法表示。实型常量C语言中默认是存储成双精度浮点数的,但是可以通过后缀f表示成单精度浮点型数据。例如:2.7默认为doublue型,2.7f则为float型。
①浮点表示法:实数由正负号、阿拉伯数字0~9和小数点组成,必须要有小数点,且小数点的前后至少一边要有数字。若小数点前没有数字,则默认整数部分为0,同样若小数点后没有数字,也默认小数部分为0。实数的浮点表示法又称实数的小数形式。
② 科学计数法:实数有正负号、数字和字母e(或E)组成,e是指数的标志,则e之前要有数据,e之后的指数只能是整数。实数的科学计数法又称实数的指数形式。
例:3.14、2.(小数点后没有数字)、.2(小数点前没有数字)与6.026E-27是合法的实数,而0.2E2.3和E-5都是非法表示。
科学计数法一般用于表示很大或者很小的数,如普朗克常数 6.026 × 1 0 − 27 6.026×10^{-27} 6.026×1027可以表示为6.026E-27,也可以表示为60.26e-28、602.6e-29或0.6026e-26。

四、基本数据类型的存储单元大小

由于不同的编译平台相同的数据类型所占用的存储单元不同,C语言可以使用sizeof关键字来查看不同的数据类型所占用的字节数。下面是采用Dev-C++测试前面所讲的所有数据类型的大小:

#include 

int main(void)
{
	printf("sizeof(char) = %d\n", sizeof(char));
	printf("sizeof(int) = %d\n", sizeof(int));
	printf("sizeof(unsigned int) = %d\n", sizeof(unsigned int));
	printf("sizeof(short) = %d\n", sizeof(short));
	printf("sizeof(unsigned short) = %d\n", sizeof(unsigned short));
	printf("sizeof(long) = %d\n", sizeof(long));
	printf("sizeof(unsigned long) = %d\n", sizeof(unsigned long));
	printf("sizeof(long long) = %d\n", sizeof(long long));
	printf("sizeof(float) = %d\n", sizeof(float));
	printf("sizeof(double) = %d\n", sizeof(double));
	printf("sizeof(-15) = %d\n", sizeof(-15));
	printf("sizeof(-15l) = %d\n", sizeof(-15l));
	printf("sizeof(-15ll) = %d\n", sizeof(-15ll));
	printf("sizeof(15u) = %d\n", sizeof(15u));
	printf("sizeof('a') = %d\n", sizeof('a'));
	printf("sizeof('\\r') = %d\n", sizeof('\r'));
	printf("sizeof('2.3') = %d\n", sizeof(2.3));
	printf("sizeof('2.3f') = %d\n", sizeof(2.3f));
	printf("sizeof('2.3E2') = %d\n", sizeof(2.3E2));
	
	return 0;
 } 

sizeof(char) = 1
sizeof(int) = 4
sizeof(unsigned int) = 4
sizeof(short) = 2
sizeof(unsigned short) = 2
sizeof(long) = 4
sizeof(unsigned long) = 4
sizeof(long long) = 8
sizeof(float) = 4
sizeof(double) = 8
sizeof(-15) = 4
sizeof(-15l) = 4
sizeof(-15ll) = 8
sizeof(15u) = 4
sizeof(‘a’) = 4
sizeof(‘\r’) = 4
sizeof(‘2.3’) = 8
sizeof(‘2.3f’) = 4
sizeof(‘2.3E2’) = 8

参考 C语言程序设计(第4版)/何钦铭,颜晖 例题及课后习题参考程序https://gitee.com/sgxgitee/mooc-c

你可能感兴趣的:(C语言,c语言)