zoukankan      html  css  js  c++  java
  • 2020.9.17 第二课 C语言中数据类型 2,8,10进制转换 计算机内存数值存储方式(补码转换)

    c语言中数据类型

    2.1.1关键字

    • C的关键字共有32个

    • 数据类型关键字(12个)

       

    char(字符型)/char取值范围为-128到127

    unsigned char为0-255/,short(短整型)*/16位系统中一个short(两个字节)能储存的范围为-32768~32767,而unsigned(无符号)short能储存的数据范围则是0-65535}/*

           ,int(整型),long(长整型)*/4个字节,{-2^31~(2^31-1)}/*,float(单精度浮点数),double(双精度浮点数)

    */short=2

    int=4

    long=4

    float=4

    double=8   /* 

    可以通过printf(“%d”,sizeof(函数类型));   一个字节=8比特=8位

    unsigned(无符号的),signed(有符号的)

    ,struct(结构体)(聚合数据类型)//学生管理系统`

    ,union(共用体、联合),一个union对象可以有多个数据成员,但在任何时刻只有一个成员可以有值。**

    //“联合”与“结构”有一些相似之处。但两者有本质上的不同。在结构中各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和(空结构除外,同时不考虑边界调整)。而在“联合”中,各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度。应该说明的是, 这里所谓的共享不是指把多个成员同时装入一个联合变量内, 而是指该联合变量可被赋予任一成员值,但每次只能赋一种值, 赋入新值则冲去旧值。

    enum(枚举类型)

    enum` `weekday{sun,mon,tue,wed,thu,fri,sat};
    enum` `weekday a,b,c;
    //或者为:
    enum` `weekday{sun,mon,tue,wed,thu,fri,sat}a,b,c;
    //或者为:
    enum``{sun,mon,tue,wed,thu,fri,sat}a,b,c;

    //,void(无类型)void真正发挥的作用在于:

    (1) 对函数返回的限定;

    (2) 对函数参数的限定。

     

    • 控制语句关键字(12个)

      if,(语句)if 语句的3种形式

      1. if(表达式)语句 (单分支if语句)

        2 if(表达式)语句1 else 语句2 (双分支if语句)

        3 if(表达式1)语句1

      else(否则)(一般用于if语句),

      switch(开关语句、切换语句)(判断选择)

      例1

      #include<stdio.h>

    int main() {
              double score;
              printf("请输入分数: ");
              scanf_s("%lf", &score);
            switch ((int)(score / 10))
              {
            case 10:
              case 9:printf("A(最好) "); break;
              case 8:printf("B(优秀) "); break;
            case 7:printf("C(良好) "); break;
              case 6:printf("D(及格) "); break;
            case 5:
              case 4:
            case 3:
              case 2:
              case 1:
              case 0:printf("E(不及格) "); break;
            default:printf("Error! ");
              }
       
      return 0;
    }

      
    ```c
    #include<stdio.h>
    int main()
    {
        char rank;
      printf("请输入分数等级:(A、B、C、D、E) ");
        scanf("%c",&rank);
        switch(rank)
        {
          case'A':printf("A(90~100) ");break;
            case'B':printf("B(80~89) ");break;
          case'C':printf("C(70~79) ");break;
            case'D':printf("D(60~69) ");break;
            case'E':printf("E(0~59) ");break;
            default:printf("error! ");break;
      }
        return 0;
    }

      例3

    #include<stdio.h>
     int main()
    {
         int year,month,date,leap,days = 0;
       printf("请输入年份:");
         scanf("%d",&year);
       printf("请输入月份:");
         scanf("%d",&month);
       printf("请输入日:");
         scanf("%d",&date);
       leap=(year%4==0&&year%100!=0||year%400==0);
         switch(month)
      {
             case 12:days+=30;
           case 11:days+=31;
             case 10:days+=30;
           case 9:days+=31;
             case 8:days+=31;
             case 7:days+=30;
             case 6:days+=31;
             case 5:days+=30;
             case 4:days+=31;
             case 3:days+=28+leap;
             case 2:days+=31;
             case 1:days+=date;break;
             default:printf("data error");break;
        }
         printf("%4d年%2d月%2d日是这一年的第%d天。 ",year,month,date,days);
         return 0;
    }

     

    **default(系统默认值)(计算机等)自动转到(默认值)

      for,(循环语句)

      最常用的

      

      for(int i = 0; i< 10; i++)    //i++ 跟 i=i+1效果相同 
    {
     printf("i = %d ",i);
    }

      递减式for

      

      for(int i = 10; i > 0; i -= 3)    //i-=3 跟 i=i-3效果相同 
    {
     printf("i = %d ",i);
    }

      递增式for

      

      for(int i = 10; i > 0; i += 3)    //i+=3 跟 i=i+3效果相同
    {
     printf("i = %d ",i);
    }

     

      `*do,**(do在一些计算机语言中是保留字,作用大多情况下是开始一层循环,需要和while配合使用)```

      do{

      循环体

      }while(表达式);

      while,

      do <语句> while(<条件>)

      while(<条件>) <语句>;

      break(跳出循环)(终止所在层的循环。在 C语言 的 switch(开关语句)中,break 语句还可用来在执行完一个 case(分支)后立即跳出当前 switch 结构。在某些程序调试过程中则使用break设置断点。)

      break语句用于do-while、for、while循环语句中时,可使程序终止循环。而执行循环后面的语句,通常break语句总是与if语句联在一起。即满足条件时便跳出循环。

     

      ,continue(结束本次循环,而不终止整个循环的执行。而是结束本次循环,进行下一次循环。),

      goto,(跳转、转到)

      return(返回)

     

    • 存储类型关键字(5个)

      auto(自动存储变量的关键字,也就是申明一块临时的变量内存)

      ,extren,(外部的)(extern关键字都允许其他文件在不确定其定义位置的情况下使用该文件)

      register,(缓存器)(修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度)

      static,(静态的)

      const(只读)(修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。)

    • 其他关键字(3个)

      sizeof(操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。),

      typedef,(定义类型)(一种数据类型定义一个新名字)

      在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。

      volatile(易变的volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。

    2.1.2数据类型

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

       基本类型:  整形(int,short,long),字符型(char),实形/浮点型(float,double)

    数据类型:       构造类型: 数组类型,结构类型(struct),联合类型(union),枚举类型(enum)        

        指针类型:(char *,int *, int **等)

    2.1.3 常量

    • 常量

      • 在程序运行过程中,其值不能被改变的量

      • 常量一般出现在表达式或赋值语句中

    • 整形常量:100,200,-100,0

    • 实形常量:3.14,0.125,-3.66456

    • 字符型常量:'a','b','c','d','e'

    • 字符串常量:"Hello World","输出"

    2.1.4变量

    • 变量

      • 在程序运行过程中,其值可以被改变

      • 变量在使用前必须先定义,定义变量必须有相应的数据类型

    • 标识符命名规则:

      • 标识符不能是关键字

      • 标识符只能由字母,数字,下划线组成

      • 第一个字符必须为字母或者下划线

      • 标识符中字母区分大小写

    • 变量的特点

      • 变量在编译时为其分配相应的内存空间

      • 可以通过其名字和地址访问相应内存

    • 声明和定义的区别

      • 声明变量不需要建立存储空间.如:extern int a;

      • 定义变量需要建立存储空间,如:int b;

    #include <stdio.h>

    int main(){
       //extern关键字只做声明,不能做人和定义,后面还会学习,这里先了解
       //声明一个变量a,a在这里没有建立存储空间
       extern int a;
       a=10;//没有空间,就不可以赋值

       int b=10; //定义一个变量b,b的类型为int,b赋值为10
       
       return 0;
    }

    从广义的角度来讲声明中包含着定义,即定义是声明的一个特例,所以并非所以的声明都是定义

    • int b 它既是声明,同时又是定义

    • 对于extern int b来讲它只是声明不是定义

    一般情况下,把建立存储空间的声明称之为'定义',而把不需要建立存储空间的声明称之为'声明'.

    2.1.5 使用示例

    #include <stdio.h>
    #define MAX 100
    /*
    	1.#开头的语句是预处理语句,无需分号结束
    	2.定义一个宏定义标识符MAX,它代表100,MAX它是常量
    	3.宏定义以后的代码都可以使用MAX
    	4.在后面出现的MAX,预处理都会替换为100
    */
    
    int main(){
        
        
        MAX;
        MAX;
        
        //const 是一个关键字,作用是修饰一个变量只读
        const int b=10086;
        
        return 0;
    }
    
    
    

    2.2进制

    二进制,八进制,十进制,十六进制

    进制也就是进位制,是人们规定的一种进位方法,对于任何一种进制---X进制,就表示某一位置上的数运算时逢X进一位,十进制逢十进一,十六进制是逢十六进一,二进制是逢二进一,以此类推,X进制就是逢X进一. 

    • 二进制,位,字节与字

      我们习惯于十进制的数:10,12等

      一个位只能表示0,或者1两种状态,简称bit,一个位是一个bit

      一个字节位8个二进制,称为8位,简称BYTE,8个bit是一个字节

      一个字(汉字)为2个字节,简称WORD

      两个字为双字,简称DWORD

    • 八进制
      八进制以8为基数的进制系统,c语言当中用0表示八进制,比如:0666

    • 十六进制
      十六进16为基数的进制系统,c语言当中用0x表示十六进制

     

    16->2  (8421) (4位一分)

    16                     6                       9                      4         2

                       8421               8421                  8421  8421

                        0110                1001                0100    0010

     

    8->2   (421)(三位一分)

        8                7                         1                     4              2

       2                421                    421                   421        421

                          111                     001                   100        010

    //进制的输出方式
    #include <stdio.h>
    
    int main(){
        
        int a=10;//什么都不写默认是十进制数据
        int b=010;//数字前面加个0表示八进数据
        int c=0x10;//数字前面加个0x表示十六进制数据
        
        printf("%d
    ",a);//%d表示按照十进制数据输出显示
        printf("%o
    ",b);//%o表示按照八进制数据输出显示
        printf("%x
    ",c);//%x表示按照十六进制数据输出显示
        return 0;
    }
    
    

     

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

    原码

    将最高位作为符号位(0代表正,1代表负),其余各位代表数值本身绝对值

    	+7的原码是00000111
        -7的原码是10000111
        +0的原码是00000000
        -0的原码是10000000
    

    反码

    • 一个数如果为正,那么反码和原码相同

    • 一个数如果为负,那么符号位为1,其他各位与原码相反

    	+7的反码00000111
        -7的反码11111000
        +0的反码00000000
        -0的反码11111111    
    

    补码

    原码和反码都不利于计算机运算,如:原码表示的7和-7相加,还需要判断符号位

    整数:原码,反码,补码都相同

    负数:最高位为1,其余各位原码取反,最后对整个数+1

    	-7的补码:=
            10000111(原码)
            11111000(反码)
            11111001(补码)
        +0的补码为:00000000
        -0的补码为:
    		10000000(原码)
            11111111(反码)
           100000000(补码)  
        补码符号位不动,其他位求反,最后整个数+1,得到原码
        用补码进行运算,减法可以通过加法实现        
        7-6=1
        7的补码和-6的补码相加:00000111+11111010=100000001
            进位舍弃后,剩下的00000001就是1的补码.
    		7:				-6:
    		00000111(原码)   	 10000110(原码) 
            00000111(反码)	 11111001(反码)	
            00000111(补码)     11111010(补码)
            00000111(7的补码)
            11111010(-6的补码)
           100000001(1)
         -7+6=-1
         -7的补码和6的补码相加:11111001+00000110=11111111       
         -7:				6:
    	 1000 0111(原码)		0000 0110(原码)
         1111 1000(反码)		0000 0110(反码)
         1111 1001(补码)      0000 0110(补码)          
    

    作业

    一、

    数据类型关键字

    char(字符型)short(短整型)int(整型)long(长整型)float(单精度浮点型)double(双精度浮点型)unsighed(无符号型)signed(有符号型)struct(结构类型)union(联合型)enum(枚举型)void(空型)

    控制语句关键字

    if(如果)else(否则,另外)

    switch(开关)case(情况)default(默认)for(循环)

    do (做)while(在...情况)break(打破,跳出循环)continue(继续,结束本次循环进入下一次循环)goto(跳转)return(返回)

    存储类型关键字

    auto(自动)extern(外来的,表示声明)register(注册,表示频繁使用,建议在cpu)static(静态全局变量)const(常数,表示只读)

    其他关键字

    sizeof(求内存字节)

    typedef(定义类型)

    volatile(易变的)

    二、

    const(常量)可以理解为只读,保护重要程序,节省空间

    #define(定义)  宏替换

    在C语言中const关键字修饰的变量可以修改

    const int x=10086;

    int* p=&x;

    *p=10010;

    三、

                                                                 

                         15                               -10= 5           (10进制)

              0000 1111         1000   1010

    原码                              1000   1010 

    反码                               1111  0101

    补码  0000  1111    +     1111  0110=      0 0000   0101

     

    -15              +                    10 =               -5(10进制)

    1000 1111          0000 1010

    反码1111 0000

    补码1111 0001  + 0000 1010 =1111 1011

    验算 原码=补码的反码+1                                                    补码=原码的反码+1

    -5补码     1111  1011

    补码的反码    1000  0100

    -5原码+补码的反码+1   1000 0101    -5

     

                                               0000 0101    -5

  • 相关阅读:
    正式班D25
    解决oracle用户锁定
    python学习第17天
    python学习第16天
    python学习第15天
    python学习第十四天
    python学习第13天
    Python基础
    python学习第12天
    python学习第11天
  • 原文地址:https://www.cnblogs.com/heerha/p/13702534.html
Copyright © 2011-2022 走看看