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

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

 

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

  for,(循环语句)

  最常用的

  

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

  递减式for

  

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

  递增式for

  

  for(int i = 10; i > 0; i += 3)    //i+=3 跟 i=i+3效果相同
{
 printf("i = %d\n",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\n",a);//%d表示按照十进制数据输出显示
    printf("%o\n",b);//%o表示按照八进制数据输出显示
    printf("%x\n",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

posted @ 2020-09-20 21:50  鹤儿哈  阅读(275)  评论(0编辑  收藏  举报