目录
1.整型int
概念:表达整数类型的数据
语法:
int a = 520; // 定义了一个专门用来存储整数的变量a
注意:int 的本意是 integer,即整数的意思 int a 代表在内存中开辟一块小区域,称为 a,用来存放整数,a 一般被称为变量。 变量a 所占内存大小,在不同的系统中是不一样的,64位系统典型的大小是4个字节。 变量 a有固定的大小,因此也有取值范围,典型的范围是:-2147483648到2147483647。
2.整型修饰符short、long、unsigned
short:用来缩短整型变量的尺寸,减少取值范围并节省内存,称为短整型
long:用来增长整型变量的尺寸,增大取值范围并占用更多内存,称为长整型
long long:用来增长整型变量的尺寸,增大取值范围并占用更多内存,称为长长整型
unsigned:用来去除整型变量的符号位,使得整型变量只能表达非负整数
short int a; // 短整型
long int b; // 长整型
long long int c; // 长长整型
==unsigned int e; ==// 无符号整型
unsigned short int f; // 无符号短整型
unsigned long int g; // 无符号长整型
unsigned long long int h; // 无符号长长整型
使用整型修饰符后,关键字 int 可以被省略:
short a; // 短整型
long b; // 长整型
long long c; // 长长整型
unsigned e; // 无符号整型
unsigned short f; // 无符号短整型
unsigned long g; // 无符号长整型
unsigned long long h; // 无符号长长整型
3.符号位
定义:有符号的整型数据,首位为符号位,0表示正数,1表示负数。 无符号的整形数据,没有符号位。
编码形式:
原码:正数直接使用二进制来表达,比如a=100,在内存中是 00…001100100。
补码:负数用绝对值取反加一来表达,比如a=-3,在内存中是11…1111111101 注意负数的补码在取反加一的时候,符号位是不动的。
溢出:超过数据所能表达的范围,称为溢出,就像汽车里程表,最大值和最小值是相邻的。
进制:源码中可以使用八进制、十进制或十六进制,但实际数据在内存中一律是二进制
十进制(默认),比如1099
八进制,比如013
十六进制,比如0x6FF0A
4.格式控制符%d
int 整型:%d
short 整型:%hd, h代表half,即一半的存储字节
long 整型:%ld
long long 整型:%lld
显示不同进制的前缀: %#o、 %#x
%d:用来输出有符号的十进制整数(包括char类型)
%u:用来输出无符号的十进制整数(包括char类型)
%o:用来输出无符号的八进制整数
%x:用来输出无符号的十六进制整数
%c:用来输出单个字符
%s:用来输出一个字符串
%f:用来输出小数形式的十进制浮点数(输入时小数形式和指数形式都可以识别)
%e:用来输出指数形式的十进制浮点数(输入时小数形式和指数形式都可以识别)
%g:用来输出指数形式和小数形式两者中较短的十进制浮点数(输入时小数形式和指数形式都可以识别)
5.浮点型float
概念:用来表达实数的数据类型
分类:单精度浮点型(float),典型尺寸是4字节
双精度浮点型(double),典型尺寸是8字节
长双精度浮点型(long double),典型尺寸是16字节 占用内存越多能表达的精度越高
float f1; // 单精度
double f2; // 双精度
long double f3; // 长双精度
6.字符char+ASCII码表
char ch1 = 'a'; // 'a'是字符常量,代表字母a
char ch2 = '\n'; // '\n'是不可见字符常量,代表回车
计算机中存储的都是1和0,因此各种字符都必须被映射为某个数字才能存储到计算机中,这种映射关系形成的表称为 ASCII 码表。如下:
字符本质上就是一个单字节的整型,支持整型所有的运算。比如:
#include <stdio.h>
int main(){
char c1 = 20;
char c2 = c1 + 'a'; // 等价于 char c2 = 20 + 97;
printf("%c\n", c2); // 以字符形式输出117,即 'u'
printf("%d\n", c2); // 以整型形式输出117
}
7.字符串char *s1+char s2[]+指针和数组
定义:字符串定义可以使用两种:指针or数组
char *s1 = "abcd"; // 使用字符指针来表示字符串
char s2[]= "abcd"; // 使用字符数组来表示字符串
注意:使用数组来定义字符串时,方括号[]里面的数字可以省略不省略也可以,但必须必字符串实际占用的内存字节数要大。
8.布尔型数据bool
概念:布尔型数据只有真、假两种取值,非零为真,零为假。
bool a = 1; // 逻辑真,此处1可以取其他任何非零数值
bool b = 0; // 逻辑假
注意: 逻辑真除了 1 之外,其他任何非零数值都表示逻辑真,等价于 1。 使用布尔型 bool 定义变量时需要包含系统头文件stdbool.h。 布尔型数据常用语逻辑判断、循环控制等场合。
9.常量和变量
概念:不可改变的内存称为常量,可以改变的内存称为变量
eg:
int a = 100; // a是变量,而100是常量
float f = 3.14; // f是变量,而3.14是常量
char s[] = "abcd"; // s是变量,"abcd"是常量
10.标准输入 scanf+fgets+stdin
概念:键盘是系统的标准输入设备,从键盘中输入数据被称为标准输入
scanf(); // 格式化输入函数
fgets(); // 字符串输入函数
int a;
float f;
scanf("%d", &a); // 从键盘输入一个整型,放入指定的内存地址 &a 中
scanf("%f", &f); // 从键盘输入一个浮点数,放入指定的内存地址 &f 中
scanf("%d%f", &a, &f); // 从键盘依次输入一个整型和一个浮点型数据,用空白符隔开
char c;
char s[10];
scanf("%c", &c); // 从键盘输入一个字符,放入指定的内存地址 &f 中
scanf("%s", s ); // 从键盘输入一个单词,放入指定的数组 s 中(注意不是&s)
fgets(s, 10, stdin); // 从键盘输入一行字符串,放入数组 s 中
注意: scanf() 与 printf() 不同,scanf() 的格式控制串不可乱写,尤其是结尾处的 \n 用户必须完全按照 scanf()中描述的输入格式控制串来输入数据,否则将出错。
// 此处输入时必须带逗号
scanf("%d,%d", &a, &b);
// 此处必须先输入a=,然后才能输入整数
scanf("a=%d", &a);
// 此处结束输入时按下的回车符将被scanf()误以为格式控制符,无法正常结束输入
scanf("%d\n", &a);
注意:scanf() 的返回值,代表成功从键盘读取的数据的个数 无法匹配 scanf() 指定格式的数据,将被遗留在输入缓冲区中,不会消失 示例:
// scanf() 试图从键盘读取两个整数
// 返回值 n 代表成功读取的个数,比如:
// 输入100 200,则 n 将等于2
// 输入100 abc,则 n 将等于1
// 输入abc xyz,则 n 将等于0;输入abc 200,n也将等于0
int n = scanf("%d%d", &a, &b);
// 根据 scanf() 的返回值,判断用户是否输入了正确的格式
while(n != 2)
{
// 需要清空缓冲区并提示用户重新输入
char s[50];
fgets(s, 50, stdin);
printf("请重新输入两个整数\n");
n = scanf("%d%d", &a, &b);
}
11.练习2day
-
第一题:指出下列常量的类型
‘\b’
1066
99.44
0XAA
2.0e30
0x00EEABCDUL - 解答:
'\b' : char字符型数据,代表退格键
1066 : int整型数据,十进制整数
99.44: float浮点型数据
0XAA : int整型数据,十六进制整数
2.0e30 : float浮点型数据,科学计数法,代表2乘以10的30次方
0x00EEABCDUL : unsigned long无符号整型数据,十六进制,末尾的UL代表无符号长整型
第二题:
编程实现如下功能:
如果用户输入大小写字母,则输出字母对应的ASCII码值。
如果用户输入ASCII码值,则输出对应的大小写字母。
解答:
#include <stdio.h>
int main(void){
int ch;
while(1){
int n;
printf("请输入一个ascll码或者一个字符:");
n = scanf("%d", &ch);//判断输入的ch是否是一个整型
// 输入了ASCII码值
if(n == 1 && getchar() == '\n'){//输入一个值,并且敲了回车
printf("%d ascll码对应的字符: %c\n",ch,ch);
}//of if
// 输入了非数字字符
else if(n == 0){
ch = getchar();
if(ch>='A'&&ch<='Z' || ch>='a'&&ch<='z')
printf("%c 对应的ascll码值: %d\n", ch);
else
printf("letters only\n");
}//of else if
// 数字后面带有非法字符
else{
printf("只能输入整数或字母\n");
while(getchar()!='\n');
}//of else
}//of while
return 0;
}//of main
第三题:
假设有如下程序,程序输出的结果是什么?
int main(void) { unsigned char a, b, c; a = 0x3; b = a|0x8; c = b<<1; printf("%d \n %d\n", b, c); }
解答:
这是简单的位运算的题目,a在二进制中的数位是【0000 0011】,与十六进制数0x8的二进制数位是【0000
1000】,因此这两数数相或的结果是:【0000 1011】,所以 b 等于11。
对上述二进制数据 b 进行左移 1 位操作,结果是【0001 0110】,所以 c 等于22. 最终输出的结果是: