C语言入门 -- 数据类型

c语言程序中使用的各种变量都应预先加以定义,即先定义,后使用.

对变量的定义可以包括三个方面:数据类型,存储类型,作用域

所谓数据类型是按被定义变量的性质,表示形式,占据存储空间的多少,构造特点来划分的.

在C语言中,数据类型可分为基本数据类型,构造数据类型,指针类型,空类型四大类.

1. 基本数据类型:  

  基本数据类型最主要的特点是,其值不可以再分解为其它类型。也就是说,基本数据类型是自我说明的。

2. 构造数据类型:  

  构造数据类型是根据已定义的一个或多个数据类型用构造的方法来定义的。也就是说,一个构造类型的值可以分解成若干个“成员”或“元素”。每个“成员”都是一个基本数据类型或又是一个构造类型。在 C 语言中,构造类型有以下几种:

  • 数组类型
  • 结构体类型
  • 共用体(联合)类型

3. 指针类型:  

  指针是一种特殊的,同时又是具有重要作用的数据类型。其值用来表示某个变量在内存储器中的地址。虽然指针变量的取值类似于整型量,但这是两个类型完全不同的量,因此不能混为一谈

4 .空类型:

  在调用函数值时,通常应向调用者返回一个函数值。这个返回的函数值是具有一定的数据类型的,应在函数定义及函数说明中给以说明.但是,也有一类函数,调用后并不需要向调用者返回函数值,这种函数可以定义为“空类型”。其类型说明符为 void。

常量

对于基本数据类型量,按其取值是否可改变又分为常量和变量两种。在程序执行过程中,其值不发生改变的量称为常量,其值可变的量称为变量。它们可与数据类型结合起来分类。例如,可分为整型常量、整型变量、浮点常量、浮点变量、字符常量、字符变量、枚举常量、枚举变量。在程序中,常量是可以不经说明而直接引用的,而变量则必须先定义后使用。整型量包括整型常量、整型变量

整型常量

整型常量就是整常数,在c语言中使用的整常数有八进制,十进制,十六进制三种.

十进制 : 十进制整常数没有前缀.其数码为0~9

八进制 : 八进制整常数必须以0开头,即以0最为前缀(所以十进制不能以0开头),数码取值为0~7.八进制通常是无符号数

十六进制 : 十六进制整常数的前缀为0X或0x,其数码取值为0~9,A~F或0~9,a~f

整型常量的后缀 :

  在不同的机器上基本整型的长度是不同的,所以他能表示数的范围也是有限的.如果超出了范围,就必须用长整型数来表示.长整型数是用后缀L或l来表示的.

  123L和123在数值上并没有区别,只是在占用内存空间上不同

  无符号数也可用后缀表示,整型常数的无符号数的后缀为"U"或"u"

实行常量(浮点常量)

实型也称为浮点型。实型常量也称为实数或者浮点数。在C语言中,实数只采用十进制。它有二种形式:十进制小数形式,指数形式。

十进制数形式 : 右数码0~9和小数点组成(必须有小数点)

指数形式 : 由十进制数,加阶码标志"e"或"E"以及阶码(只能为数字,可以带符号)组成

标准C允许浮点数使用后缀,后缀为“f”或“F”即表示该数为浮点数.

  如356f和356.0是等价的

字符常量

  字符常量使用单引号括起来的一个字符.例如'a','b','+',','

在C语言中,字符常量有以下特点:

  1.字符常量只能用单引号括起来,不能用双引号或其他括号

  2.字符常量只能是单个字符,不能是字符串

  3.字符可以是字符集中的任意字符,但数字被定义为字符型之后就不能参与数值运算.

    如'5'和5是不同的

字符串常量

  字符串常量是有一对双引号括起来的字符序列.例如"China","me"

字符串常量和字符常量是不同的量,他们之间主要有以下区别

  1.字符常量由单引号括起来,字符串常量由双引号括起来。

  2.字符常量只能是单个字符,字符串常量则可以含一个或多个字符。

  3.可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。在C语言中没有相应的字符串变量。这是与 BASIC 语言不同的。但是可以用一个字符数组来存放一个字符串常量。

  4.字符常量占一个字节的内存空间.字符串常量占得内存字节数等于字符串中字节数加1.增加的1个字符中存放'\0'(ASCII码为0).这是字符串结束的标志.

    字符常量'a'和字符串常量"a"虽然虽然都只有一个字符,但在内存中的情况是不同的.

变量

其只可以改变的量称为变量.一个变量应该有一个名字,在内存中占据一定的存储单元.变量定义必须放在变量使用之前.

变量的定义

// 类型说明符 变量名标识符,变量名标识符..;
// 可以在一个类型说明符后面定义多个相同类型的变量.各变量名之间用逗号间隔,类型说明符与变量名之间至少用一个空格间隔
// 最后一个变量名之后必须以;结尾
// 变量定义必须放在变量使用之前.
// 可以在变量声明时进行赋值

整型变量

定义一个整型变量

int main(){
  int a;
  return 0;  
}

整型数据在内存中的存放形式

数值是以补码表示的:

  • 正数的补码和原码相同;
  • 负数的补码:将该数的绝对值得二进制形式按位取反再加1

例如:

由此可知左面的第一位是表示符号的

整型变量的分类

基本型: int

短整型: short int 或 short

长整型: long int 或 long

无符号型: unsigned. 无符号型与上述三种类型匹配构成

  无符号类型量所占的内存空间字节数与相应的有符号类型量相同.但由于省去了符号位,故不能表示负数.

查看类型所占的字节数

#include <stdio.h>
#include <string.h> 

int main()
{
	int a,b,c;
	a = sizeof(short);
	b = sizeof(int);
	c = sizeof(long);
	printf("短整型%d,基本类型%d,长整型%d",a,b,c);
	return 0;
	
}
//短整型2,基本类型4,长整型4  在不同的机算计上基本类型可能会有不同的结果

整型数据的溢出

有符号短整型占2个字节,16位,所能表示的最大数为2**15-1(因为最开始一位要表示符号),即32767

#include <stdio.h>
int main()
{
	short int a,b;
	a = 32767;
	b= a+1;
	printf("%d",b);
	return 0;
}
-32768

 

实型变量

实型变量在内存中的存放形式

实型数据一般占4个字节(32位)内存空间.按指数形式存储.

实数3.1415926在内存中的存放形式如下

+ .31415926 1

 

  • 第一部分 : 数符
  • 第二部分 : 小数部分,小数部分占的位(bit)越多,数的有效数字越多,精度越高
  • 第三部分 : 指数部分,指数部分占得位数越多.则能表示的数值范围越大

实型变量的分类

单精度(float) 双精度(double) 长双精度(long double)

类型说明符 比特数(字节数) 有效数字 数的范围
 float  32(4)  6~7   10e-37~10e38
 double  64(8)  15~16   10e-307~10e308
 long double  128(16)  18~19   10e-4931~10e4932

实型数据的舍入误差

由于实型变量是由有限的存储单元组成的,因此能提供的有效数字总是有限的.

#include <stdio.h>
#include <string.h> 

int main()
{
	float a,b;
	a = 123456.789e5;
	b= a+20;
	printf("%f",b);
	return 0;
}
//12345678848.000000

下一个例子

#include <stdio.h>
#include <string.h> 

int main()
{
	float a;
	double b; 
	a = 333.33333333333333;
	b = 333.33333333333333;
	printf("%lf\n%lf\n",a,b);
	return 0;
}
//333.333344
//333.333333

  

从本例可以看出,由于a是单精度浮点型,有效数字只有7位,而整数已占3位,所以小数后4位之后均为无效数字.

b是双精度型,有效数字为16位.但Turbo C规定小数后最多保留6位,其余部分四舍五入

字符变量

变量字符用来存储字符常量,即单个字符.字符变量的类型说明符是char.

字符数据在内存中的存储形式及使用方法

每个字符变量被分配一个字节的内存空间,因此只能存放一个字符.字符值是以ASCII码的形式存放在变量的内存单元之中的.

比如x十进制的ASCII码是120,在内存中存放的就是他的二进制代码

0 1 1 1 1 0 0 0

 

所以也可以把他们看作整型量.c语言允许对整型变量赋以字符值,也允许对字符变量赋以整形值.在输出是,允许把字符变量按整型量输出,也允许把整型量按字符量输出.

整型量为二字节量,字符量为单字节量,当整型量按字符型量处理时,只有低八位字节参与处理.

#include <stdio.h>
#include <string.h> 

int main()
{
	char a=120;
	int b=120;
	printf("char:%c,%c\n",a,b);  // printf(),%c和%d是不同类型的占位符
	printf("int:%d,%d\n",a,b);
	return 0;
}
//char:x,x
//int:120,120

  c语言允许字符变量参与数值运算,即用字符的ASCII码参与运算.

各类数值类型数据之间的混合运算

变量的数据类型是可以转换的。转换的方法有两种,一种是自动转换,一种是强制转换。自动转换发生在不同数据类型的量混合运算时,由编译系统自动完成。自动转换遵循以下规则:

1) 若参与运算量的类型不同,则先转换成同一类型,然后进行运算.

2) 转换按数据长度增加的方向进行,以保证精度不降低.如int和long运算时,先把int转换成long在进行运算

3) 所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double,在做运算

4) char和short参与运算时,必须先转为int型

5) 在赋值运算中,赋值号两边的数据类型不同时,右边的转换为左边的,如果右面的数据类型长度长时,将丢失一部分数据,这样会降低精度,丢失部分按四舍五入向前舍入

强制类型转换

强制类型转换是通过类型转换运算来实现的.

其形式为

(类型说明符)(表达式)

其功能是把表达式的运算结果强制转换成类型说明符所表示的类型

强制转换是要注意的问题

1) 类型说明符合表达式都必须加括号(单个变量可以不加括号)

2) 无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行临时性的转换,而不改变数据说明时对该变量定义的类型

posted @ 2018-03-08 22:33  瓜田月夜  阅读(774)  评论(0)    收藏  举报