1.2 数据类型
1.2.1基本类型
char、sh6rt int、int、 long int、float、 double
扩展:常量和变量
常量:在程序运行过程中,其值不可以改变的量
例: 100‘a’ “hello"
➢整型100,125, -100, 0
➢实型3.14,0.125f, -3.789
➢字符型'a’,‘b’,‘2'
➢字符串“a”, “ab”,“1232”
变量:其值可以改变的量被称为变量
int a=100;
a=101;
字符数据
➢字符常量:
直接常量:用单引号括起来,如: 'a'、 'b、'q'等.
转义字符:以反斜杠“\"开头,后跟一个或几个字符、如'\n','\t'等,分别代表换行、横向跳格.
'\\'表示的是\ ‘%%' ' \''
➢字符变量:
用char定义,每个字符变量被分配一个字节的内存空间
字符值以ASCII码的形式存放在变量的内存单元中;
注: char a;
a='x';
a变量中存放的是字符x的ASCII :120
即a=120跟a='x在本质上是一致的.
#include <stdio.h>
int main (){
unsigned int i;
for (i=0;i<=255;i++)
{
printf("%d%c",i,i);
if(i%10==0)//每十个换一行
printf("\n");
}
return 0;
}
#include <stdio.h>
int main (int argc,char*argv[]){
{
char a='x';
char b=120;
printf("a=%c\n",a);
printf("b=%c\n",b);
}
return 0;
}
运行结果
![](https://i-blog.csdnimg.cn/blog_migrate/30c8c009ad17cb7b65f6001d7bc387b7.png)
字符串常量
是由双引号括起来的字符序列,如“CHINA"、”哈哈哈”
“C program",“$12.5” 等都是合法的字符串常量.
字符串常量与字符常量的不同
‘a'为字符常量,"a"为字符串常量
每个字符串的结尾,编译器会自动的添加一个结束标志位^\0',
即“a”包含两个字符‘a' 和’\0'
整型数据
整型常量: (按进制分) :
十进制:以正常数字 1-9开头,如457 789
八进制:以数字0开头, 如0123
十六进制:以0x开头,如0xle
a=10,b=11,c=12, d=13,e=14,f-=15
整型变量: .
➢有/无符 号短整型(um/signed)shor(int) 2 个字节
➢有/无符号 基本整型(m/signed) int 4个字节
➢有/无符 号长整型(um/signed) long (int) 4 个字节 (32位处理器)
实型变量
单精度(float)和双精度(double)3.1415926753456
float型:
占4字节,7位有效数字,指数-37到38
3333.333 33
double型:占8字节,16 位有效数字,指数-307到308
格式化输出字符:
%d 十进制有符号 整数
%u 十进制无符号整数
%x 以十六进制表示的整数
%o 以八进制表示的整数
%f float 型浮点数
%lf double型浮点数
%e 指数形式的浮点数
%s 字符串
%c 单个字符
%p 指针的值
特殊应用:
%3d %03d %-3d %5.2f
%3d:要求宽度为3位,如果不足3位,前面空格补齐;如果足够3位,此语句无效
%03d:要求宽度为3位,如果不足3位,前面0补齐;如果足够3位,此语句无效
%-3d:要求宽度为3位,如果不足3位,后面空格补齐;如果足够3位,此语句无效
%.2f:小数点后只保留2位
#include <stdio.h>
int main (){
char a='x';
int b=101;
float c=3.14f;
double d=1.23;
int e=0x3d;
printf("a=%c\n",a);
printf("b=%d\n",b);
printf("c=%f\n",c);
printf("d=%lf\n",d);
printf("e=%x\n",e);
printf("e=%d\n",e);
return 0;
}
运行结果
![](https://i-blog.csdnimg.cn/blog_migrate/df40f0331df0ffcc617c080eadc84eb6.png)
1.2.2构造类型
概念:由若干个相同或不同类型数据构成的集合,这种数据类型被称为构造类型
例: int a[10];
数组、结构体、共用体、枚举
1.2.3类型转换
数据有不同的类型,不同类型数据之间进行混合运算时必然涉及到类型的转换问题.
转换的方法有两种:
1.自动转换:
遵循一定的规则,由编译系统自动完成.
2.强制类型转换:
把表达式的运算结果强制转换成所需的数据类型
自动转换的原则:
1、占用内存字节数少(值域小)的类型,向占用内存字节数多(值域大)的类型转换,以保证精度不降低.
2、转换方向:
![](https://i-blog.csdnimg.cn/blog_migrate/4d408115eb45fe7fdc0098777bd932b6.png)
1)
当表达式中出现了char 、short int、int 类型中的一种或者多种,没有其他类型了,参加运算的成员全部变成int类型的参加运算,结果也是int类型的
#include <stdio.h>
int main (){
printf("%d\n",5/2);
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/c67273fc375c239e6f00f28be6178c47.png)
#include <stdio.h>
int main (){
printf("%lf\n",5.0/2);
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/853cd2913af873cdc5c6e6ca4382db4b.png)
3)
当表达式中有有符号数也有无符号数,参加运算的成员变成无符号数参加运算结果也是无符号数.(表达式中无实数)
#include <stdio.h>
int main (){
int a=-8;
unsigned int b=7;
if(a+b>0)
{
printf("a+b>0\n");
}
else
{
printf("a+b<=0\n");
}
printf("%x\n",(a+b));
printf("%d\n",(a+b));
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/f27e304a01ebf587d1f5289fa42234b6.png)
4)在赋值语句中等号右边的类型自动转换为等号左边的类型.
#include <stdio.h>
int main (){
int a;
float b=5.8f;//5.8后面加f代表5.8是float类型,如果不加的话认为是double类型
a=b;
printf("a=%d\n",a);
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/8572070e6c810b4e95f12cc294b03744.png)
强制转换:通过类型转换运算来实现
(类型说明符)(表达式)
功能:
把表达式的运算结果强制转换成类型说明符所表示的类型
例如:
(float)a; // 把a的值转换为实型
(int)(x+y); // 把x+y的结果值转换为整型
注意:类型说明符必须加括号
#include <stdio.h>
int main (){
float x=0;
int i=0;
x=3.6f;
i=x;
i=(int)x;
printf("x=%f,i=%d\n",x,i);
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/80257d73776d6a979cc941d0a169a1dc.png)
说明:
无论是强制转换或是自动转换,都只是为了本次运算的需要,而对变量的数据长度进行的临时性
转换,而不改变数据定义的类型以及它的值