day2-变量、进制、输入输出

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("格式控制符格式控制符",&变量名,&变量名);  // 输入以空格 回车作为输入的结束
        
        
    
        
        
        
        
    
    
            
            
    
    
    
    
    
    
        
        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值