c语言数据类型

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修饰的局部变量,声明周期执行到程序结束,第一次执行开辟空间,后面使用直接用缓存
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值