三、数据类型
3.1 基本类型
char、short、int、long、float、double
#include <stdio.h>
int main()
{
//定义一个char类型的变量并赋值
char c='a';
printf("%c\n",c);//a
//定义应该short类型的变量并赋值
short a=10;
printf("%d\n",a);//10
//定义一个int类型的变量并赋值
int b=20;
printf("%d\n",b);//20
//定义一个long类型的变量并赋值
long d=3639382;
printf("%ld\n",d);//3639382
//定义一个float类型的变量并赋值
//默认保留小数点后六位,并且可以四舍五入
float e=3.1415926;
printf("%f\n",e);//3.141593
//定义一个double类型的变量并赋值
double f=3.147896526654;
printf("%lf\n",f);//3.147897
//printf("Hello World!\n");
return 0;
}
3.2 扩展:常量和变量
常量:在程序运行过程中,其值不可以改变的量
例:100、'a'、'hello'
常量的分类:
整型:100、125、250
实型:3.14、0.125f、-3.5
字符型:'a'、'b'
字符串:"a"、"ab"、"1234"
ASCLL表:
A~Z范围(65~90)
a~z范围(97~122)
#include <stdio.h>
int main()
{
char c='a';
//用%c输出的是输出字符,用%d输出的是字符的ascll码值
printf("%d,%c\n",c,c);//97,a
return 0;
}
变量:其值可以改变的量称之为变量
定义变量的方式:
存储类型 数据类型 变量名;
存储类型 数据类型 变量名=变量或常量;
整型数据:
整型常量(按进制分):
十进制:以正常数字1-9开头,如 458 250
八进制:以数字0开头,如:0125
十六进制:以0x开头,如:0x1e
整型变量:
有/无符号短整型(un/signed)short(int) 2个字节
有/无符号整型(un/signed)int 4个字节
有/无符号长整型(un/signed)long(int) 4个字节
实型数据(浮点型):
实型常量:
实型常量也称为实数或者浮点数
十进制形式:由数字和小数点组成:0.0、0.12、5.0
指数形式:123e3 代表 123*10 的三次方
123e-3代表123*10的负三次方
不以f结尾的常量是 double 类型
以 f结尾的常量(如 3.14f)是 float 类型
实型变量:
单精度(float)和双精度(double)3.1415926753456
float 型:占4字节,7位有效数字,指数-37 到383333.333 33
double 型:占8字节,16 位有效数字,指数-307 到308
字符数据:
字符常量:
直接常量:单引号括起来,如:'a'、'b'、’0’等.
转义字符:以反斜杠“\”开头,后跟一个或几个字符、如'\n,\t'等,分别代表换行、横向跳格
'\\'表示的是\'%%''\''
字符变量:
用 char 定义,每个字符变量被分配一个字节的内存空间字符值以 ASCLL 码的形式存放在变量的内存单元中:
注:char a;
a='x':
a 变量中存放的是字符'x'的 ASCLL :120
即 a=120 跟 a-=x'在本质上是一致的.
字符串常量
是由双引号括起来的字符序列,如“CHINA”、”哈哈哈”等都是合法的字符串常量.
字符串常量与字符常量的不同
'a’为字符常量,”a”为字符串常量
每个字符串的结尾,编译器会自动的添加一个结束标志位'\0',即“a”包含两个字符'a’和’\0’
3.3 格式化输出字符
%d 十进制有符号整数
%ld 十进制 1ong 有符号整数
%u 十进制无符号整数
%o 以八进制表示的整数
%x 以十六进制表示的整数
%f float 型浮点数
%lf double 型浮点数
%e 指数形式的浮点数
%c 单个字符
%s 字符串
%p 指针的值
#include <stdio.h>
int main()
{
//输出整数
int a=100;
//输出十进制数
printf("a=%d\n",a);
//输出八进制数
printf("a=%o\n",a);
//输出十六进制数
printf("a=%x\n",a);
//输出浮点型数据,float使用%f,double使用%lf
float b=3.1415926;
double c=3.1415926;
printf("b=%f\n",b);
printf("c=%lf\n",c);
//输出字符,使用%c输出字符,使用%d输出字符的ascll码值
char d='a';
printf("%d,%c\n",d,d);
//输出字符串,使用%s
char e[]="hello world";
printf("e=%s\n",e);
//输出地址,使用%p
//&:取一个变量的地址,一般地址用十六进制数标识
int f=999;
printf("&f=%p\n",&f);
return 0;
}
特殊应用:
%3d %03d %-3d %5.2f
%3d:要求宽度为3 位,如果不足3位,前面空格补齐;如果足够3位,此语句无效
%03d:要求宽度为3位,如果不足3位,前面0补齐:如果足够3位,此语句无效
%-3d:要求宽度为3位,如果不足3位,后面空格补齐:如果足够3位,此语句无效
%.2f:小数点后只保留2位
3.4 类型转换
数据有不同的类型,不同类型数据之间进行混合运算时必然涉及到类型的转换问题
转换的方法有两种
自动转换:
遵循一定的规则,由编译系统自动完成
强制类型转换:
把表达式的运算结果强制转换成所需的数据类型
自动转换:
1.占用内存字节数少(值域小)的类型,向占用内存字节数多(值域大)的类型转换,以保证精度不降
低
2.转换方向:
(1)当表达式中出现了char、short int、int类型中的一种或多种,没有其他类型了,参加运算的成员全部变成int类型的参加运算,结果也是int类型的
例:
#include<stdio.h>
int main()
{
printf("%d\n",5/2);//2
return 0;
}
(2)当表达式中出现了带小数点的实数,参加运算的成员全部变成double类型的参加运算,结果也是double型
例:
#include<stdio.h>
int main()
{
printf("%f\n",5.0/2);//2.5
return 0;
}
(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");
}
return 0;
}
//结果为a+b>0
(4)在赋值语句中等号右边的类型自动转换为等号左边的类型
例:
#include<stdio.h>
int main()
{
int m;
float b=5.8f;
m=b;
printf("m=%d\n",m);//结果为m=5
printf("n=%lf\n",n);//结果为n=5.8
return 0;
}
(5)注意自动类型转换都是在运算的过程中进行临时性的转换,并不会影响自动类型转换的变量的值和其类型
强制转换:
通过类型转换运算来实现
(类型说明符)(表达式)
功能:
把表达式的运算结果强制转换成类型说明符所表示的类型
例如:
(float)a;//把a的值转换为实型
(int)(x+y);// 把x+y 的结果值转换为整型
注意:
类型说明符必须加括号
#include<stdio.h>
int main()
{
int x=10;
int y=4;
float w;
w=(float)x/(float)y;
printf("w=%f\n",w);
return 0;
}