C语言中的数据类型

day 1

数据类型

给数据分类

C中数据结构

基本类型

C语言已经定义好的

整型

singed char/unsigned char //字符型 1字节
singed int/unsigned int //整型 4字节
singed short/unsigned short //短整型 2字节
singed long int/unsinged long int // 长整型 4字节 不固定,不同环境不同大小

浮点型

float 单精度浮点数 4字节
double 双精度浮点数 8字节
long double  16字节

构造类型

自定义类型
	数组
	结构体
	枚举
	共用体

指针类型

void类型

三个地方
	1.void作为函数的参数,表示函数没有参数
	2.作为函数的返回值,表示没有返回值
	3.void * 作为通用指针

变量和常量

定义数据对象:
	变量	可变
	常量 不可变
变量的定义
数据类型 变量名{=初值}
	数据类型 变量类型,系统自动分配空间
	变量名 命名规则:以字母或下划线开头,只包含数据、字母、下划线
	初始值 不指定初始值,变量会有一个值,可能是0,可能随机
		分配空间,一定有值,bit要么是0要么是1,分配了空间,继承原有空间的电容,内部就有值
变量的属性
1.变量的名字
	程序运行时,代表变量
2.变量的类型
	决定系统分配的变量的空间大小
3.变量的值
	int a = 250;
	存储单元, 系统会为每一个存储单元分配(以字节为单位)一个唯一的编号
	变量有两个值,一个是本身的值(右值, 可变),一个是系统分配的地址也就是编号(左值, 不变)

在C语言中,任何变量都有左值和右值

变量的操作
read 读一个变量的值
write 把一个值写入对应存储单元
例如:
	int a,b;
	a = 5;
	b = a;
	
	a = 5;//a的写操作,把5写入a的地址中
	b =a ;//a的读操作,把a的值拿出来,写入b

整数在计算机中的存储形式

整数在计算机中是以二进制的补码存放

  • 补码
    • 非负整数, 补码就是原码
    • 负整数, 绝对值的原码的补码,按位取反,末位加一
计算机中存储 1111 1101
如果是 char类型,它就是-3
如果是 unsigned char 他就是 253
对于 signed 和unsigned 的区别就是数据的最高位是不是符号位
	最高位为1 代表是负数
	最高位为0 代表是非负数
非十进制的加减问题

对于nbit的数据x(x为正数)

-x 和 2n-x在计算机中的存储形式是一样的

char 类型的整数的取值范围 -27- 27 - 1

10000000表示-128,1代表符号位,-0无意义,-1为11111111,一直递减,到10000000,此时定义为-128

一段8bit的空间可以保存的整数取值范围为-128 - 255

char a = 255;//把255写入到a的存储单元中,a的存储单元为8个1 所以a的值就是-1

printf函数

 功能 向终端输出
 使用printf必须包含头文件<stdio.h>
 printf(const char * farmat,...);
printf("格式化字符串",输出列表);
	格式化字符串中的内容:
		1.可以是任意的字符,英文,中文,符号
		2.格式化控制字符
			% + 字符组成
		%d: 将后面的整数,以 int 类型输出
		%u: 将后面的整数,以 unsigned int 类型输出
		%o: 将后面的整数,以8进制(无符号)输出
		%x: 以16进制输出
		%c: 以char 类型输出(输出一个字符的形状)
		%ld: 以 long int 输出
		%lld 以 long long int 输出
		%p: 以16进制输出一个地址(数据的左值)
		%%: 输出一个%
		...
		3.转义字符
			\ + 字符
			\n 输出一个换行
			\t 横向跳格
			\r 制表
输出到中端的内容:
	1.按照格式化字符串里面的内容原样输出
	2.输出地址列表里的变量
	3.输出对应内容
程序验证
#include <stdio.h>
1.
int main()
{
	int a = -3;
	printf("%d\n",a); //-3
	printf("%u\n",a); //2^32-3
}

2.
int main()
{
	unsigned char a = 255;
	char b = 255;
    printf("%d---%d\n",a,b); //255, -1
    解释:将 a看成 32位有符号数据,要拉长,由于a本身是无符号,拉长时补0
    a ==> int==> 00000000 00000000 00000000 11111111
    
    将 b看成 32位有符号数据,要拉长,由于b本身无符号的,符号位是1
    b ==> int ==> 11111111 11111111 11111111 11111111 
}

printf("%u",a): printf 把后面那个a(不管是什么类型),都看成 unsigned int 输出


3.
int main()
{
	char a = -1; 
	int b = a;  //把短的数 赋值给长的数
	a = b; //把长的数赋值给短的数
	
	// b的值-1,a的值-1
	
	usnigned char c = -1
	int d = c;
	c = d;
	//d的值是 255,c的值 255
}

-3 232-3

255----1

不同类型之间的整数赋值问题

  • C语言支持不同类型的整数进行赋值
  • 代码中出现的数字都是int类型

长短不一的数据如何赋值

  • 长的数据赋值给短的数据

    • 低字节直接拷贝,高字节直接丢弃
  • 短的数据赋值给长的数据

    • 如果短的是有符号位的,高位补符号位,如果是负的,补完1之后,按位取反还是0,不影响数值
    • 如果短的是无符号位的,高位补0

对于负数来说,以补码形式存储,按符号位补1,就是对数值补0,对数值不造成影响

int main()
{
	char a = -3;// 1111 1101
	int b = 1;//00000000 00000000 00000000 00000001
}
问上述 a+b 大于0还是小于0
//a+b = 11111111 11111111 11111111 11111110 
//转换为int 型得 -2 故小于0
    
int main()
{
	char a = -3;// 1111 1101
	unsigned int b = 1;// 00000000 00000000 00000000 00000001
}
问上述 a+b 大于0还是小于0
//a+b = 11111111 11111111 11111111 11111110
//转换为 unsigned int得2^32 -2+ 故大于0

int main()
{
	char a = -3;
	unsigned short b = 1;
}
问上述 a+b 大于0还是小于0
//char 和unsigned都低于int型,先做整型提升为int型,-3+1=-2
//故小于0
    
int main()
{
	char c = 255;//1111 1111
	char d;
	d = c+192;//  192 1100 0000 + 1111 1111 = 1011 1111
	printf("%d\n",d);//1111 1111 1111 1111 1111 1111 1011 1111
	printf("%u\n",d);//1111 1111 1111 1111 1111 1111 1011 1111
	return 0;
}
//c为1111 1111 加上1100 0000得1011 1111,转换为int型为1111 1111 1111 1111 1111 1111 1011 1111 
//故输出为-65 2^32-65

192是int型,没定义的数字都是int型,把c提升到intx型,为11111111 111111111 11111111 11111111 加上 00000000 00000000 00000000 11000000 得1111 1111 1111 1111 1111 1111 1011 1111,然后赋值给char 类型的d,得1011 1111

两边运算都低于int型,需要做整型提升到int型进行计算,否则提升为最高类型的数据进行运算

int main()
{
    unsigned char a = -3;//11111111 11111111 11111111 1111 1101
}
256-3+1=254
a + 1 = 254
    
int main()
{
    unsigned char c = 250;//1111 1010
    char d;
    d = c + 9;//0000 1001  =1 0000 0011
    3
    3   
}

常量

在程序运行中,不能改变的量

常量的形式
整型常量
	十进制常量
		1,2,3......
	八进制常量
		0[0-7]+ : 0开头,后面接若干个0-7之间的数字
	
	八进制和二进制对应
		一个八进制数对应三个二进制数
	
	十六进制常量
		0[Xx][0-9][A-F][a-f]+ :以0X 或0x开头,后面接若干0-9 or A-F or a-f
	字符常量
		'', 单引号引起来的一个或者多个字符的序列,用来表示一个字符常量
	ASCII码保存字符的值
		'\000':
			由\后面接一个、两个、三个这样的八进制数,可以用来代表所期望的字符的ASCII码
		'\x000'
			由\x后面接一个、两个这样的十六进制数,可以用来代表所期望的字符的ASCII码
	char a = 58;
	char a = ':';
	char a = 072;
	char a = 0x3a;
	char a = '\072';
	char a = '\x3a';
	都表示 :
	
	char a = 0;//a的值0
	char a = '0';//a的值是48
	char a = '\0';//a的值是0

在这里插入图片描述
在这里插入图片描述

浮点型常量

在计算机中存储方式

浮点型常量由整数部分,小数点,小数部分,一个可选的E/e,一个可选的带符号的整型指数,和一个可选的表示后缀类型的符号(F/f/l)
	没有后缀默认double类型
	
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值