C语言基础——数据类型

数据类型:   即 对 不同类型的数 的 表示 和 存储 。有 整数类型  和精确类型 

    char   字符型      8bit     1字节  存储这个数   0-255  共256个数
   short   半字类型  16bit    2字节                       0-2^16-1 = 65535
    int      整型          32bit    4字节                       0-2^32-1 = 4,294,967,295
    long   长整型       64bit    8字节                       0-2^64-1 = 

int  与 long 存储大小   
    一些8位单片机 51   int 2字节  long  4字节 
    一些32位单片机  stm32 或 LinuxC   int 4字节  long 8字节 

signed         有符号类型    不写默认是有符号类型 
unsigned     无符号类型

signed    char  有符号字符型   -128 ~ + 127
unsighed  char  无符号字符型

有符号与无符号的区别 
    负数如何表示   -2 -10  -1 
    有符号数  最高bit 作为符号位  0 正数 1 负数 
    signed    char   -128 ~ 0  ~ +127
    补码形式 存储有符号类型  
    LinuxC中:
        不写 signed  默认 都是有符号   gcc  
        单片机C中   arm gcc     
        char 不写  默认无符号类型 
        除char类型 外  其他不写signed  默认是有符号类型 

        最高位 为 符号位   其余位 存储值  若值是负数  补码 
        负数值 = 补码取反 +1 

强类型语言: 
    C语言:  任何变量或存储空间 必要先定义(给定类型 ) 然后才能使用 
        且 使用过程中 类型不不能更改 

小数:  2.5  0.71231   0.0000000000000012   21873541623584713527412348234.12341341
非精确类型:  数据 有 有效位数 超过有效位数的数据丢弃 
浮点类型存储与表示: 
    使用幂指数方式存储小数
    0.25 * 10^-1 
    0.71231 * 10^0
    0.12 * 10^-14
    0.21873541 * 10^29

浮点数存储:
    flaot  单精度浮点型   4字节存储    有效十进制位数 约6位
    最高bit 符号位   8bit 幂指数位  23 位有效位 
    
    double 双精度浮点型   8字节存储    有效十进制位数 约15位 
    最高bit 符号位   11bit 幂指数位  52 位有效位 

逻辑上: 
    布尔类型 bool  真  假   有一些运算 或操作 其结果是布尔类型  关系运行  逻辑运算
C语言中  真  非0 为真    0假 

void 类型  空类型  

C语言中的常量 
常量: 程序运行过程中 始终不变的量 
    
    整型常量:  5  10 -5 整数值  8   
    浮点常量:  2.5 -3.7 
    指数常量:  3.0e-26  => 3*10^-26
    字符常量:  单个英文字符  'a' '8' === 56 ASCII
    字符串常量:  多个字符放在一起  "hello world"  
                在内存中 存储的是 字符的 编码 连续存储
    标识常量(宏定义):  本质是给 常量  定义一个字符串形式的 别名 
        #define 宏名  值 
        #define PI  3.14
        #define WATER   3.0e-26  
        
字符在计算机中的存续:
    将非数值类型数据  进行  编码  转换为 数值类型  存储;
    英文字符 与 数字 符号  ASCII 编码标准 
        编码
        0-31   表示一些 文本动作 
        32-126 有对应字符  

        解码  字库 
        65  ====> 'A'
    

变量     
变量: 程序运行过程中 可能改变的量 
    其本质 即 给一个 内存空间 命名   通过该名字访问内存 
    C语言中 的 变量 1. 先定义在使用   2. 定义时给定类型 一旦定义完成 其类型将不能改变 
示例 变量的定义:
    存储类型  数据类型   变量名;
    auto         int        a;  // 即表示 声明一段4字节内存空间  命名为 a 
    若省略存储类型 即 auto 类型 

存储类型:  决定了 变量存储的位置 
    C语言内存结构: 
常量或代码:     a.out
    1.代码段:  存储代码 即编译的二进制指令   只读 
    2.常量区:  存储程序中的 常量  "" 的部分 常量字符串   只读 
        可以使用 const 关键字  修饰全局变量  将该变量的存储位置 变更为常量区 
变量:    
    3.静态区:  可读可写   只能被初始化 一次  在程序开始运行时  
            该区域变量 将从程序开始 一直存在到程序结束
            未初始化的 静态区变量  都默认初始化为0
    4.堆区:    有程序员 在程序运行时 可以手动 动态(长度不确定)申请或释放的 内存     
    5.栈区:    有程序运行时 自动(函数形参或局部变量) 申请或释放的 内存 
            未初始化的栈区堆区变量  其初始值不确定 
            
由系统维护的数据:
    6.系统区:  LinuxC有, 存储操作系统对于该进程的 一些数据  
                    进程控制块,内存占用情况, 环境变量等   只读  

全局变量: 变量定义的位置 在函数外(不在任何函数内 {}) 可以在整个程序中使用     
局部变量: 变量定义的位置 在函数内( 在 {}  中定义的) 只能在{}内部使用 

    auto     修饰全局变量   该变量存储与 静态区  
    auto     修饰局部变量   该变量存储与 栈区 
    const    修饰全局变量   该变量存储与 常量区 
    
    static     修饰局部变量   该变量存储与 静态区   
            只能在{}内使用    只能被初始化 一次  在程序开始运行时
    static    修饰全局变量   该变量存储与 静态区  
            只能在当前C文件中使用  只能被初始化 一次  在程序开始运行时 
            多用于防止全局变量重名 导致的问题
            
    static  修饰函数   该函数只能在 本文件内使用 

变量赋值    变量名  =  值; 即 向内存中 写入值 
变量初始化  即  定义时 赋值 ;

    extern  修饰全局变量  表示外部 引入 存储类型  不开辟新的内存 空间 
            是一种声明 
    extern  函数          表示引入外部文件实现的 函数        

    register   寄存器类型 声明   表示变量 尽量使用寄存器存储 
            通常用于修饰 在一段代码中 使用极其频繁的 量  
            该存储类型的变量 不能取地址 &

变量名: 由编程者 自己定义的名字 
    程序中  变量名  函数名  宏名   都是 标识符 
    命名规范: 
        1. 只能由 字母 数字 下划线 组成  区分大小写 
        2. 不能由数字开头  
        3. 不能与 关键字重名   32个

int 张3;  int  7a;   int char;   不行
int _abc;   int printf;   可以 

库标识符:  库中 有对于该标识的定义  
系统标识符:  由编译定义了的  include 

数据类型的转换:   将类型不匹配 的数据 转换为 对应匹配类型的数据格式 
    隐式类型转换: 有编译器  自动完成  一些默认转换模式 
    强制类型转换: 编程者 手动进行的 强制性的类型 转换 
        变量 或 值  前  使用(目标类型)

类型的转换过程: 
    float --->  int    舍弃小数   取整操作 
    int   --->  float  整型(精确类型)  小数(非精确类型) 精度会丢失
    
    int   --->  char   溢出部分舍弃   宽存储空间 转换为  小存储空间 
    int   --->  short   
                        小存储空间 转换为    宽存储空间   不影响 

    整型与浮点型 参与运算时   隐式类型转换 会统一转换为浮点型计算
    
    有符号数  无符号数  强制类型转换时  存储内容 完全没有改变  但影响计算 
    
C语言中标准输入与输出:
    标准输入: 程序终端 输入的内容 
    标准输出: 程序输出 到终端显示 
    
输出:   使用man  函数名  查询该函数 
    putc();    输出一个字符  'a'
    putchar();  与putc一样 
    puts();    输出一个字符串  "hello world"
    格式化输出函数 
    printf();

       #include <stdio.h>

       int printf(const char *format, ...);
       
       int sprintf(char *str, const char *format, ...);
       int snprintf(char *str, size_t size, const char *format, ...);
    
    sprintf/snprintf 即格式化后 输出到 指定内存容器str中

返回值:  成功 返回 格式化后输出的字符个数 

... 变长参数个数 

    使用:  format 格式控制字符串 "a=%d\n",a  其中 a=\n  原样输出 
                    %d  格式占位控制符

        %d  输出整型有符号数  以10进制方式显示 
        %x  输出整型无符号数  以16进制方式显示 
        %u  输出整型无符号数  以10进制方式显示
        %c  输出一个 字符型数 以字符方式显示
        %s  输出一个字符串    以\0 作为结束符 
        %f  输出一个浮点类型  以10进制方式 
        
        %%  输出%本身

        附加格式说明符(修饰符):
        %8d  输出整型有符号数  以10进制方式显示
                在数据值宽度低于8个字符位置时  填充空格维持8个字符位置 
                -8  向左对齐 
                8   默认右对齐
        %.2f  输出一个浮点类型  以10进制方式  保留2位小数   四舍五入

        %ld  输出整型有符号数 宽度为8字节long 以10进制方式显示
        %lf  输出 double 类型的浮点数 

标准输入:
    #include <stdio.h>

       int fgetc(FILE *stream);  //得到一个字符
       int getc(FILE *stream); //得到一个字符
       int getchar(void); //得到一个字符
   
    char *fgets(char *s, int size, FILE *stream);  //得到一行输入
    s: 存放输入字符串的容器  char buf[20];
    size:  容器的大小 单位字节 
    stream:  stdin 
scanf: 格式化输入 
       int scanf(const char *format, ...);
       int sscanf(const char *str, const char *format, ...);
            sscanf 从str内存中 按格式提取

    格式控制字符串:  非常类似于printf 
                %d 表示 输入提取为一个整型数 
                %f 表示 输入提取为一个小数数 
                %4d 表示 输入提取为一个整型数 宽度为4个数字 
                %4c 表示 输入提取4个字符 组成字符串
                %s  输入一个字符串  默认以空格 或 回车 或 制表符(tabl)
                
    返回值  表示成功的提取项的个数 

练习: 
    输入两个数  输出其和

 

高级用法: 
    输入身份证号码  510502202205050016   取出 生日 
    
    printf("请输入你的身份证号码:");
    scanf("%*6d%4d%2d%2d%*5c",&y,&m,&d);

 


    
    scanf 处理输入字符串时 会存在 输入残留  通常会导致 残留到下一次输入内容
        处理残留:
            %*c   将后续所有字符都 取出丢弃 
            %*6d  取出6个数字 丢弃 
            %*2c  取出2个字符 丢弃
     

  

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值