Lseeon2 常用数据类型


数据类型

1、常量与变量

1.1 关键字

C的关键字有32个

  • 数据类型关键字(12个)
    • char,short,int,long,double,float,unsigned,signed,struct,union,enum,void
  • 控制语句关键字(12个)
    • if,else,switch,case,default,for,do,while,break,continue,goto,return
  • 存储类关键字(5个)
    • auto,extern,register,static,const
  • 其他关键字(3个)
    • sizeof,typedef,volatile

1.2 数据类型

作用:编译器预算对象(变量)分配的内存空间大小

image.png

整型:

#include

int main(void)
{
	//黄瓜3元  ,购买5斤
	const int price = 3; //常量,只读变量
	//price = 5;//error
	int weigt = 5;
	int sum;
	sum = price * weigt;

	printf("%d\n", sum);
	return 0;
}

一个项目只能有一个main函数,因为这个问题出了好多错误,一直解决不了,最后排查 发现是可以写多个源文件,但是只能有一个main函数,在main后面加数字也不行!!!

**两个反斜杠\相当于一个'\' **

std::endl 换行 ,用<< 连接 : 例如:std::endl "零"<

std::cout : 输出显示

system是用来直接调用cmd指令的,用法是system("要输入的指令")

shutdown,直接关机

标识符定义规则:

  1. 不能使用系统关键字
  2. 允许使用字母数字下划线
  3. 不允许数字开头
  4. 标识符区分大小写
  5. 见名知意

2.2 整型:int

打印命令:%d:输出一个有符号的10进制int类型

%o:输出8进制的int类型

%x:输出16进制的int类型,字母以小写输出

%X:输出16进制的int类型,字母以大写输出

%u:输出一个10进制无符号数

定义八进制以0开头:0123;

定义十六进制以0x开头:0x123

在计算机定义数据时,不可以直接定义二进制的数

#include 

int main0301(void)
{

	int a = -10;

	printf("%d\n", a);
}

int main()
{

	main0301();
	//进制
	int a = 166;
	printf("%d\n", a);
	printf("%x\n", a);
	printf("%o\n", a);
	return 0;
}

输出:

-10
166
a6
246

写scanf时遇到警告的解决办法:

把警告写到最前面,#define +错误类型

方法二:#pragma warning(disable:4996)

数据类型占得大小不用死记硬背,用sizeof就可以查看

不同整型在不同的操作系统中占得大小可能不一样。但是总体规律满足:short<=int<=long

较小的数据类型赋值给大的数据类型不会出错,会自动呗转化。但是从大转小可能会发生数据丢失(高位被丢失)。

#include

int main() {
	unsigned int len = sizeof(int);
	printf("整型int:%d\n", len);//4B=32Bit ,32位
}

输出:整型int:4

#include

int main() {
	//字符型变量
	char ch1 = 'a';
	char ch2 = 'A';

	//打印
	printf("%c\n", ch1);
	printf("字符型大小:%d\n", sizeof(ch1));
	printf("%d\n", ch1-ch2);
	printf("30%%\n");//打印%需要输入两个%才可以打印


	return 0;
}

输出:

a
字符型大小:1
32
30%

#include

int main() {
	long a1 = 20l;//l可以省略
	int a = 10;
	float b = 3.14f;//不以f结尾的会被判断为double类型
	double c = 3.14;
	printf("%2f\n", b);//保留两位小数
	printf("%f\n", c);
	//查看数据类型大小
	//浮点型数据存储在内存中的类型,分为符号位,整数位,小数位
	printf("float大小:%d\n", sizeof(b));//%p作用是输出一个变量对应的内存地址编号(无符号十六进制整型数)
	printf("double大小:%d\n", sizeof(c));

	printf("a的地址为:%p\n", &a);
	printf("b的地址为:%p\n", &b);

	getchar();

	return 0;
}

输出:

3.140000
3.140000
float大小:4
double大小:8
a的地址为:00AFF744
b的地址为:00AFF738

a的地址找到:0x010FF97C 0a 00 00 00

大小端对齐,是倒着看得这个数字

int main()
{
	float a = 3.2e-2f;
	printf("%f\n", a);//浮点型输出
	printf("%e\n", a);//科学计数法输出
	return 0;
}

输出:

0.032000
3.200000e-02

2.6 进制

大写B就是Byte,小写b是bit的意思

一个字节是8位,字节是计算机中最小的存储单位

WORD——双字节:主要用于存储汉字

DWORD——两个WORD,4字节,32位

1K——1024B

1M——1024K

C语言中二进制不能被直接表示出来

2.7 计算机内存数值存储方式

在计算机系统中,数据一律采用补码来存储。

对于正数,原码,反码,补码都相同

对于负数,补码为反码+1

算法1:(负数)补码符号位不动,其他位求反,最后+1,得到原码

算法2:

补码=原码取反再加1的逆运算。

10010110是补码,应先减去1变为反码,得10010101(补码的补码)

由反码取得源码即除符号位外其他为按位取反,得11101010,即十进制数的-106。

算法3:

负数补码速算法,由最低位(右)向高位(左)查找到第一个1与符号位之间的所有数字按位取反的逆运算

10010110是补码,符号位与最后一个1之间的所有数字按位取反,得11101010

8位数据最大存储值为???—— -27~27-1

最大值原码:01111 1111 =2^7-1=127

最小值:

原码:1111 1111

反码:1000 0000

补码:1000 0001 =-127

1000 0000 规定给了-128

数据存储时将-0对应的区间值设置为最小值 -2^7

无符号类型数据:不存在符号位

unsigned char(1字节) : 0000 0000 ~ 1111 1111 ——0~255

unsigned int(4字节) : 1111 1111 1111 1111 1111 1111 1111 1111 —— 0~2^32-1= 4294967295

2.7.5 数值溢出

当超过一个数据类型能够存储的最打范围时,会发生数据溢出

有符号位最高位溢出的区别:符号位溢出会导致正负发生变化,但最高位的溢出会导致最高位丢失

#include

int main() {
	char ch = 127;
	char ch1 = ch + 1;
	char ch2= ch + 2;
	printf("%d\n", ch1);
	printf("%d\n", ch2);

}

输出:

-128
-127

2.8 类型限定符

extern:声明一个变量 ,声明的变量没有建立存储空间

extern int a; 定义时创建了存储空间,一般不用写extern,因为定义的时候就是一个声明的过程

const:定义常量

volatile: 防止编译器优化代码 volatile int a; ,防止赋值之前被编译器优化,后面找不到了。

register: 定义寄存器变量,提高效率。register是建议型指令,而不是命令型指令,如果CPU有空闲的寄存器,就可以生效,没有的时候是无效的。

2.9 字符串格式化输入和输出

%s占位符,表示输出一串字符串,遇到\0停止。

“a”输出的时候,是占2个字符的,因为“”会默认是输出加上\0

‘a’就只有一个字符

#include

int main() {
	//char a = 'a';
	char* b = "hello world";
	char * c = "hello\0 world";
	char d[11] = "hello world";//不带最后隐藏的\0是11个字符

	printf("%s\n", b);
	printf("%s\n", c);
	printf("%s\n", d);

}

输出:

hello world
hello
hello world烫烫烫烫虜|o

image.png

%% % 输出一个百分号

printf附加格式:

image.png

#include

int main()
{
	int a = 10;
	float b = 1.56;

	printf("%d\n", a);
	printf("===%-5d===\n", a);//-表示左对齐,一共五位
	printf("===%5d===\n", a);//右对齐
	printf("===%05d===\n", a);//z只能在前面补零,在后面补会对本身结果产生影响
	printf("===%3.2f===\n", b);//小数点前面表示总的位数,后面表示保留的小数位数
	printf("===%7.5f===\n", b);
	printf("===%-7.5f===\n", b);
	printf("===%07.2f===\n", b);//前面补零
}

输出:

10
=10 ===
=== 10
=
=00010=
=1.56=
=1.56000=
=1.56000=
=0001.56=

scanf中不能有\n作为格式,因为函数是以换行作为结束标志的

#include
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)


int main()
{
	char ch;
	int a, b;
	
	scanf("%c", &ch);//输入多个字符的时候会取第一个
	putchar(ch);

	//在%d之间加数字,可以约束输入的位数
	scanf("%3d %d", &a, &b);//输入时通过空格或者回车输入多个数字,可以用逗号,空格,*号作为分隔符
	printf("%d \t %d", a, b);

	return 0;
}

输出:

a
a
456 123
456 123

getchar作用:读取一个char类型的字符

int main()
{
	char ch;

	ch = getchar();//getchar里面是一个void类型的
	putchar(ch);

	//如果cmd闪屏。可以写一个getchar();在return 0前面,跟system(pause)效果一样
	return 0;
}

输入a,输出a