day02
192.168.10.93
---------------------------------
昨天内容
基本数据类型 --- 空间数据的类型 空间的大小
整型:short int long long long
2 4 4/8 8
%hd %d %ld %lld
unsigned short:16位都是数据位 0 ~ 65535
short: 1为符号位+15位数据位 -32768 ~ 32767
unsigned int:3位 0 ~ 42亿
int:1+31 -21亿 ~ 21亿
unsinged long long : 0 ~ 10进制的19位
long long :-10进制的18位 ~ 10进制的18位
实型: float double
4 8
%f %lf
float:6~8
double:8以上
字符型: char
1
%c --- %d
unsinged char :8位 0 ~ 255
char:1+7 -128~127
有效字符从:0~127
----------------------------------------------------------------------------
今天内容:
1、变量
2、数据的进制
3、数据在内存存储
4、数据的输入输出
----------------------------------------------------------------------------
1、变量
教室里面有11个同学 --- 整型 --- short
工程师人数11位 --- 整型 --- short
对内存空间起名字--- 自定义的。
定义变量名:标识符的命名规范
1、只能是数字 字母 _ $ 错误的写法:a@2 正确的写法:$_$
2、不能以数字开头 错误的写法:2a 正确的写法:a2
3、不能和关键字重复 错误的写法:if
4、见名知意 --- 一些常用的单词 name age num count game
定义变量格式:数据类型 变量名; --- 开空间
定义一个变量存储教室学生的人数:unsigned short student;
定义一个变量用来存储A5的人数: unsigned short A5_people; A5People
定义一个变量用来存储中国的人数:unsigned int chinese;
定义一个变量用来存储世界的人数:unsinged long long world;
定义一个变量用来存储海拔: float haiba;
定义一个变量用来存储电脑的价格:float pc_price;
定义一个变量用来存储用户的操作按键:一次只能点击一个 char key;
定义一个变量用来存储数据:考虑 数据类型 数据范围 变量名(_连接、驼峰命名)
对空间进行赋值操作:
1、用赋值符号
2、输入赋值
1、用赋值符号 =
变量名 = 值;
需求1:教室里面有11个同学 :
定义一个变量, short num;
将班级人数保存到变量里面去。 num = 11;
printf("%hd\n",num);
明天我们新加一位同学,问明天我们班多少人:num + 1
printf("%hd\n",num+1);
代码:
#include<stdio.h>
int main()
{
short num;
num = 11;
printf("%hd\n",num);
// num+1; // 11 +1 ;
num = num + 1; // num = 11 + 1; num = 12
printf("%hd\n",num);
return 0;
}
需求2:定义一个变量a,他里面存储一个10,
定义一个变量b,存储一个20
将a和b的和计算后保存到变量c里面,
输出a b c的值
注意:变量要先定义才能使用,一般定义变量的时候将变量定义在作用域的最顶端。
代码:
#include<stdio.h>
int main()
{
short a;
short b;
short c;
a = 10;
b = 20;
c = a + b;
printf("%hd",c);
return 0;
}
规范:
如果是多个变量,类型一致,可以合在一起写; short a,b,c;
定义变量的时候,如果变量值确定可以直接写成:数据类型 变量名=值;
short a;
a = 11;
合成:short a = 11;
2、输入赋值
1、先要声明一个空间 --- 定义一个变量
2、输入函数对上述变量定义赋值 scanf("格式控制符",&变量名);
定义为一个变量,通过输入的形式对空间写一个100内的数据。
short a;
printf("请输入一个0~100内的数字:");
scanf("%hd",&a);
printf("%hd",a);
需求:自定义一个int类型的变量,对变量输入一个3位数:100~999,输出输入的数据。
需求:定义一个变量a,b,a和b都是int类型,想要一次性输入两个变量的数据。
int a,b;
printf("请输入两个数据:");
scanf("%d%d",&a,&b); // 空格或者回车都可以
printf("输入的数值a:%d,输入的数值b:%d",a,b);
变量的分类:
按照定义位置的不同,全局变量 局部变量
全局变量:在所有函数外部定义的变量 --- 全局数据区 --- 初始值为0
局部变量:在函数内部定义的变量 ----- 栈区 --- 初始值是垃圾直
-----------------------------------------------------------------------------------
练习题:
定义两个变量
输入两个数值
交换两个里面的数据
输出交换后变量中的值。
--------------------------------------------------------------------------------------------------
2、数据的进制
二进制 八进制 十进制 十六进制
掌握:二进制 十进制 十六进制
了解:八进制
十进制:逢十进一,每一位上的数字:0~9 默认
二进制:逢二进一,每一位上的数字:0 1 0b/0B 0b1010
八进制:逢八进一,每一位上的数字:0 1 2 3 4 5 6 7 0 0345
十六进制:逢十六进一,每一位上的数字:0 ~ 9 a b c d e f 0x/0X 0xa3fe
数据在内存中存储 -- 二进制形式存储
变量赋值用-- 十进制
指针,地址:十六进制表示
错误写法:0888 --- 0 八进制数 每一位0~7 不能出现8,
int a = 10;
10 --- 10进制
转成10的进行存储: a = 0b1010;
a = 012;
a = 0xa;
格式控制符:%d --- 十进制数字
----------------------------------------------------------------------------
编译器将其他进制的数字转成了10进制数字输出
int a = 10;
int b = 0b1010;
int c = 012;
int d = 0xa;
printf("%d %d %d %d\n",a,b,c,d); // 将不同进制的数字转换成10进制的数字输出。
--------------------------------------------------------------------------------
编译器将10进制转成其他进制的数组输出
其他进制的格式控制符:
short int long long long
十进制 %hd %d %ld %lld
八进制 %ho %o %lo %llo
十六进制 %hx %x %lx %llx
int a = 10;
printf("%d %o %x\n",a,a,a); // 10 12 a
printf("%#d %#o %#x\n",a,a,a); // 10 012 0xa
--------------------------------------------------------------------------------------
理解不同进制之间转换的原理
1、其他进制转十进制
0b1010;
012;
0xa
规则:相应位上的数字 * 权重 ,进行相加。
十进制为例 ,权重:
3 4 5 6
权重 1000 100 10 1
10^3 10^2 10^1 10^0
二进制的权重:
0b1010
1 0 1 0
权重 2^3 2^2 2^1 2^0 1*2^3 + 0 * 2^2+1*2^1+0*2^0 == 8 + 2 = 10;
八进制的权重
012
1 2
8^1 8^0 1 * 8 + 2 * 1 == 10
十六进制的权重:
0x3af
3 a f
16^2 16^1 16^0 3 * 16^2 + 10 * 16 ^ 1 + 15 * 16 ^0 == 943
2、十进制转其他进制
10
规则:除以 进制数 直到商为0,取余逆序排列
0b1010
012
0xa
3、二进制 八进制 十六进制 字节
3位二进制 == 1位八进制
4位第二进制 == 1位十六进制
0b10101010 --- 八进制(4 2 1) : 0b010 101 010 === 0252
0252 ------ 二进制(4 2 1) : 0b010 101 010
0b1010101111 --- 十六机制 (8 4 2 1): 0b0010 1010 1111 == 0x2af
0x2af ----- 二进制 (8 4 2 1):0b0010 1010 1111
0x3afe --- 二进制 :0b0011101011111110
十六进制数据和字节的关系
1个十六进制是4位二进制
1个字节是8位二进制
2个十六进制是1个字节
int a = 0x12345678;
0x12 0x34 0x56 0x78
4、二进制和十进制数据的快速转换。
口算:
二进制的权重图
256 128 64 32 16 8 4 2 1
129 --- 二进制数据 --- 勾选法 -- 加法 -- 数据离小的数近
256 128 64 32 16 8 4 2 1
√ √
0b10000001
18
32 16 8 4 2 1
√ √
0b10010
97 --
128 64 32 16 8 4 2 1
√ √ √
0b1100001
127 -- 二进制数据 --- 勾选法 -- 减法 -- 数据离大的数近
128 64 32 16 8 4 2 1
0 1 1 1 1 1 1 1
0b01111111
120 --
128 64 32 16 8 4 2 1
0 1 1 1 1 1 1 1 --- 127
0 1 1 1 1 0 0 0 --- 120
2023 --- 勾选法 -- 二进制表示
2048 1024 512 256 128 64 32 16 8 4 2 1
0 1 1 1 1 1 1 1 1 1 1 1 -- 2047
0b11111100111
必须掌握:十进制快速转二进制
二进制和十六进制之间相互转换
十六进制数据存储和字节的关系。
-------------------------------------------------------------------------------------
3、数据在内存存储
数据在内存里面存储的时候 存储的是数据的二进制补码形式。
unsigned short a = 10; // a 0b0000 0000 0000 1010
正数和负数
正数:原码 == 反码 == 补码 --- 同一个二进制
负数:
原码:就是一个数据本身的二进制表示形式
反码:原码的基础上保持符号位不变,其他位取反。
补码:反码+1
short --- 2个字节 -- 16位都是数据位
short a = 16;
原码:0000 0000 0001 0000;
反码:0000 0000 0001 0000;
补码:0000 0000 0001 0000;---- a空间里面的数据就是0b0000000000010000;
short b = -16;
原码:1000 0000 0001 0000; - 16的原码 原码可以看出来数据是多少
反码:1111 1111 1110 1111
补码:1111 1111 1111 0000 --- b里面存储的就是0b1111 1111 1111 0000;
证明:反过来,b = 0b1111111111110000;
printf("%hd",b);
总结:
无符号空间没有原码反码补码之说,有符号的空间负数存储才有原码 反码 补码
二进制数据是没有符号位的,数据存储到空间里面,空间有大小,对于有符号的空间才有符号位。
原码可以看出一个数据的大小,补码是存到计算机里面的二进制码
注意:二进制数据是没有符号位的,数据存储到空间里面,空间有大小,对于有符号的空间才有符号位。
int a = 0b1111111111110000; // 16位0b00000000000000001111111111110000;
short b = 0b1000000000000001; // 负数的补码
0b1000 0000 0000 0000; // 负数的反码
0b1111 1111 1111 1111; // 负数的原码 -32767
short c = 0b1000000000000000; // -32768
------------------------------------------------------------------------------------------------
数据溢出 --- 数据类型有大小 有数据范围
short b = 40000; //-25536 // -32768 ~ 32767
数据溢出会遵循环状结构,如果是正向溢出,减去 一圈范围内的数据总个数。
如果负向溢出, 加上 一圈范围内的数据总个数。
char a = 120;
char b = a * 4; // b = 480
480 - 256 == 224
224 - 256 == -32
unsigned char c = a * 4; // c = 480
480 - 256 == 224
// printf("%d",c); // %d--- 有符号的格式控制符
printf("%u",c);
代码:
#include<stdio.h>
int main()
{
char a = 120;
char b = a * 4;
printf("%d\n",b); // -32
unsigned char c = a * 4;
printf("%u\n",c); //224
return 0;
}
---------------------------------------------------------------------------------------------------
拓展:计算机为什么要设计正数和负数存储不一样?
因为计算机里面只有加法器,没有减法器
12 - 3 === 12 + (-3) --- 8位的有符号空间 char
二进制补码形式
12 :0000 1100
-3: 1000 0011 原码
1111 1100 反码
1111 1101 补码
0000 1100
1111 1101
1 0000 1001 ---- 0000 1001 == 9 // 1溢出不要
--------------------------------------------------------------------------------------
4、数据的输入输出
输出 -- printf
printf("xxx"); 输出 双引号里面的内容
1、普通字符,非转义字符和格式控制符 ---- 原样输出
printf("您好,hello C");
2、转义字符 --- 功能输出
\n '\n' --- 换行
\b '\b' --- 退格
\\ '\\' --- 输出一条\
\' '\'' --- 输出一个单引号
\" '\"' --- 输出一个双引号
\0 '\0' --- 0--- 字符串的结束符号
printf("您好,hello C\n");
printf("您好,hello C\n");
------------------------------------------
printf("hello world");
printf("\b");
printf(" ");
printf("\b");
while(1); // 死循环
-------------------------------------------
输出路径 -- windows下面
C:\news\table\abc.txt
printf("C:\\news\\table\\abc.txt");
3、格式控制符 -- 输出“”后面变量或者表达式的值
int a = 10;
int b = 20;
printf("%d",a+b);
printf("a:%d,b:%d\n",a,b); // 输出 有几个格式控制符后面就对应有几个值。
输出变量或者表达式的内容:要用到格式控制符
printf("%hd",num);
输入 --- scanf函数
scanf("格式控制符",&变量名);
scanf("格式控制符",&变量名);
scanf("格式控制符格式控制符",&变量名,&变量名); // 输入以空格 回车作为输入的结束