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

  • 相关阅读:
    mysql报错:java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone.
    MD5登陆密码的生成
    15. 3Sum、16. 3Sum Closest和18. 4Sum
    11. Container With Most Water
    8. String to Integer (atoi)
    6. ZigZag Conversion
    5. Longest Palindromic Substring
    几种非线性激活函数介绍
    AI初探1
    AI初探
  • 原文地址:https://www.cnblogs.com/heerha/p/13702534.html
Copyright © 2011-2022 走看看