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 数据类型
作用:编译器预算对象(变量)分配的内存空间大小

整型:
#include<stdio.h>
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::endl << "基础到大神";
std::cout : 输出显示
system是用来直接调用cmd指令的,用法是system("要输入的指令")
shutdown,直接关机
标识符定义规则:
- 不能使用系统关键字
- 允许使用字母数字下划线
- 不允许数字开头
- 标识符区分大小写
- 见名知意
2.2 整型:int
打印命令:%d:输出一个有符号的10进制int类型
%o:输出8进制的int类型
%x:输出16进制的int类型,字母以小写输出
%X:输出16进制的int类型,字母以大写输出
%u:输出一个10进制无符号数
定义八进制以0开头:0123;
定义十六进制以0x开头:0x123
在计算机定义数据时,不可以直接定义二进制的数
#include <stdio.h>
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<long long
较小的数据类型赋值给大的数据类型不会出错,会自动呗转化。但是从大转小可能会发生数据丢失(高位被丢失)。
#include<stdio.h>
int main() {
unsigned int len = sizeof(int);
printf("整型int:%d\n", len);//4B=32Bit ,32位
}
输出:整型int:4
#include<stdio.h>
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<stdio.h>
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<stdio.h>
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<stdio.h>
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

%% % 输出一个百分号
printf附加格式:

#include<stdio.h>
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<stdio.h>
#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

浙公网安备 33010602011771号