C的数据类型
***计算机的存储结构
计算机实现数据的输入、处理和存储和输出功能。在整个过程中,所有数据(文本数据、图形数据、音频数据、视频数据等)在计算机中的访问都采用的二进制编码形式实现,其实质就是由0和1两种状态构成的序列;
***计算机数据进制
进位制其实是一种记数的方式,所以也称为进位记数法/位值计数法,可以用有限的数字符号代表所有的数值。可使用数字符号的数目称为基数,或底数,基数为n,即可称n进位制,简称n进制。例如平常生活中我们经常用到的十进制,就是使用10个阿拉伯数字0-9进行记数,所以它的基数就是10,称为十进制。
1.二进制
二进制由于表示简单,运算简单等特点,是计算机技术中广泛采用的一种数制,二进制由两个基本数字组成,分别为0、1,运算规则为”逢二进一”。
表示方法: 数字后面加上后缀B,如:11111100101B。
2.十进制
十进制有10个基本数字,分别为 0、1、2、3、4、5、6、7、8、9,十进制的基数为10,运算规则为”逢十进一”;
表示方法:数字后面加上后缀D,如:2021D。
3.八进制
八进制有8个基本数字,分别为0、1、2、3、4、5、6、7,运算规则为”逢八进一”。
表示方法:数字后面加上后缀O,如:3745O。
4.十六进制
十六进制有16个基本数字,分别为0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F,运算规则为”逢十六进一”。
表示方法:数字后面加上后缀H,例如:7e5H。
1.基本数据类型
1.1 char字符型
char类型用于字符的存储,不过再深层理解,char类型也相当于是整数类型。char把字符转换为相应的ASCII码值存储。标准ASCII编码的范围是0-127,也就是7位二进制位,而每一个字符都有对应的ASCII编码,所以char的取值范围也是 0-127。不过通常char被定义为8位用来存放基本字符集,所以char的范围0-255。
输出char
复制给字符c=a
char c ='a';
输出c %c:这里格式化字符c
printf("%c \n",c);
1.2unsigned char
无符号数据,存储空间所有的位都表示数据位,其值域范围为:0-256
1.2signed char
有符号数据,最高位符号位(1=负数(-128…-1),0=正数(0-127)),其值域范围为:-128-127
1.2 short短整型数据
1.3 long长整型数据
1.4 int 整数型
1.5数据类型之间的转换
1.5.1自动转换
自动转换也称隐式转换,无需任何明确的指令或函数调用,是自动将较小的类型自动转换为较大的类型,隐式类型转可能会导致数据精度丢失或数据截断;
//浮点数赋给整型,该浮点数小数被舍去;
//整数赋给浮点型,数值不变,但是被存储到相应的浮点型变量中;
1 #include<stdio.h>
2 int main(){
3 int a=3;
4 float f=2.6;
5 printf("%d\n",a+(int)f);//5 数据精度丢失 ,浮点数赋给整型,该浮点数小数被舍去
}
1.52强制转换
强制类型转换可以根据类型的值,强制转换为另外一种数据类型的值,使数据更假精确,也可能会导致数据丢失。
1 #include<stdio.h>
2 int main(){
3 int a=3;
4 float f=2.6;
5 printf("%d\n",(int)(a+f)); //输出为5,5 数据精度丢失 ,浮点数赋给整型,该浮点数小数被舍去
}
注意:
1.数据转换只会改变数据的表现形式,不会改变不其在内存中的存储编码;
2.在隐式转换中,转换规则不明确,数据可能会丢失,在规则不明确的时候一般使用强制转换。
2.构造数据类型
2.1struct
结构体类型,将多个数据类型成员变量封装为整体
2.2union
共用体类型
2.3enum
枚举数据类型,将连续的多个常量值封装为整体。
3.void数据类型
void 数据类型不能直接用来修饰变量。
可以修饰函数,此时函数密钥返回值和参数。
可以修饰指针,此时指针所指向的存储空间可以是任意数据类型的指针空间。
4.常量和变量
4.1常量
数据在计算机操作的时候不能被修改的量,就叫常量;
int a= 30; a就是作为一个常量,并赋值为30;
4.1.1整数常量
整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。
整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。
212 /* 合法的 */
215u /* 合法的 */
0xFeeL /* 合法的 */
078 /* 非法的:8 不是八进制的数字 */
032UU /* 非法的:不能重复后缀 */
以下是各种类型的整数常量的实例:
85 /* 十进制 */
0213 /* 八进制 */
0x4b /* 十六进制 */
30 /* 整数 */
30u /* 无符号整数 */
30l /* 长整数 */
30ul /* 无符号长整数 */
4.1.2浮点常量
浮点常量由整数部分、小数点、小数部分和指数部分组成。您可以使用小数形式或者指数形式来表示浮点常量。
当使用小数形式表示时,必须包含整数部分、小数部分,或同时包含两者。当使用指数形式表示时, 必须包含小数点、指数,或同时包含两者。带符号的指数是用 e 或 E 引入的。
3.14159 /* 合法的 */
314159E-5L /* 合法的 */
510E /* 非法的:不完整的指数 */
210f /* 非法的:没有小数或指数 */
.e55 /* 非法的:缺少整数或分数
printf("%f\n",345.456);
printf("%e\n",345.456);
printf("%e\n",1.23E-10);
//输出为0,float只保留小数点后6位,double保留8位
printf("%f\n",0.00000000123);
4.1.3字符串常量
字符串字面值或常量是括在双引号 " " 中的。一个字符串包含类似于字符常量的字符:普通的字符、转义序列和通用的字符。可以使用空格做分隔符,把一个很长的字符串常量进行分行。下面的实例显示了一些字符串常量。下面这三种形式所显示的字符串是相同的。
"hello, world"
"hello, \
world"
"hello, " "w" "orld"
输出字符串数组
char myString[]="hello,world";
printf("%s \n",myString);
4.1.4标识符常量
4.1.5指数常量
4.2变量
在程序运行过程中,数值可以改变的量叫变量;
4.2全局变量
定义在所有程序外,在整个程序都可以访问的量叫全局变量;
#include<stdio.h>
int a=10;
int main()
{
printf("%d\n",a);
return 0;
}
最后输出a =10;
4.3局部变量
定义在main方法,和{}中的量,只能在模块内部访问的量叫局部变量;
1 #include<stdio.h>
int main()
{
//声明在方法中
int a ;
printf("%d\n",a);
{
//声明在代码块中
int x;
printf("%d\n",x);
}
return 0;
}
4.4变量的初始化
1.先定义后附值
如果定义的变量是static修饰的变量其默认值为0;
如果定义的变量是auto修饰的变量
2.定义时同时赋值
初始值可以为相同的变量和常量,初始值为定义的初始值;
5.储存类型关键字
用来修饰变量的储存空间属性;
5.1auto 自动存储类型
1.只能用来修饰局部变量,默认都是auto修饰;
2.auto修饰的变量一定存储在栈区,栈区空间一定使用的是auto修饰;
#include<stdio.h>
int main()
{
int c;
auto int b;
printf("c=%d,b=%d",c,b);
return 0;
}
5.2register寄存器存储类型
1.register只能修饰局部变量;
2.register修饰的变量存储在寄存器中,不在虚拟内存中;
3.register修饰的变量,运行效率快,寄存器变量直接运行,非register修饰的变量需要从虚拟内存搬到寄存器中;
4.寄存器变量不能取地址运算;
include<stdio.h>
int main()
{
register int c;
printf("%d\n",c);
return 0;
}
5.3extern外部声明
在变量或者函数声明使用,来说明变量或者函数已经存在,可以直接使用,主要修饰全局变量和函数;
//test1.c
#include<stdio.h>
int val=1;
void prt_val(void)
{
//%p表示输出地址,&取地址运算符,*p表示指针变量p所指向的变量的值;
printf("&val= %p\n",&val);
printf("val= %d\n",val);
}
//test2.c 在test2.c extern 调用 test1.c的全局变量和函数
#include<stdio.h>
extern int val;
extern void prt_val(void);
int main()
{
prt_val();
val=22;
//%p表示输出地址,&取地址运算符;
printf("&val :%p\n",&val);
prt_val();
}
//在一个程序访问多个文件,需要同时编译 gcc test1.c test2.c然后输出./a.out
5.4static静态存储类型
可以修饰全局和局部变量和函数;
1.static修饰的全局变量作用域为定义的文件夹在extern外部声明使用时会访问不到;
static修饰局部变量;
#include<stdio.h>
#include<unistd.h>
int main()
{
while(1){
int a=1;
static int b=1;
printf("a=%d,b=%d\n",a,b);
a++;
b++;
sleep(1);
}
return 0;
}
未被static修饰的局部变量,声明周期是语句执行到模块结束,每次执行到会开辟空间;
被static修饰的局部变量,声明周期执行到程序结束,第一次执行开辟空间,后面使用直接用缓存