C语言基础:常规的基本数据类型

数据类型

编译器预算变量(对象)分配的内存空间大小
在这里插入图片描述

关键字

C关键字共有32个

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

    char, short, int, long, float, double,

    unsigned, signed

    struct, union, enum,

    void

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

    if, else, switch, case, default,

    for, do, while, break, continue, goto, return

  • 存储类关键字(5个)

    auto, extern, register, static, const

  • 其他(3个)

    sizeof, typedef, volatile

常量与变量
  • 常量:在程序运行过程中,其值不会改变

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

    1. 在使用前必须先定义,必须指定其数据类型

    2. 标识符命名规则

      • 标识符不能为保留关键字
      • 标识符由字母、数字、下划线组成
      • 只能以字母或下划线开头
      • 标识符区别大小写
    3. 变量初始化:定义的同时赋初值

    4. 变量特点

      • 变量在编译时分配相应的内存空间
      • 可以通过其变量名或者地址访问相应的内存空间
    5. 声明和定义的区别

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

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

        #include <stdio.h>
        
        int mian()
        {
            //extern 只做声明,不能做任何定义
            //声明变量a,没有建立存储空间
            extern int a;
            a = 10; //error:undefined reference to `a',没有空间无法赋值
            //const修饰一个变量为只读,相当于常量
            const int b = 10;
            b  =20; //error: assignment of read-only variable ‘b’
            int c = b; //ok
            return 0;
        }
        
  • eg:

    #include <stdio.h>
    #define PI 3.14
    
    int main()
    {
        float r, s;
        printf("Please input r:");
     	scanf("%f", &r);
        s = PI*r*r;
        printf("this square is %.2f\n", s);
        return 0;
    }
    
进制
  • 右边是低位,左边是高位

    进制(逢x进1,接1当x)表示
    二进制0, 1
    十进制0, 1, 2, 3, 4 ,5, 6, 7
    八进制0, 1, 2, 3, 4, 5, 6, 7, 8, 9
    十六进制0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
  • 8421法
    1111 = 2 3 ∗ 1 + 2 2 ∗ 1 + 2 1 ∗ 1 + 2 0 ∗ 1 = 8 ∗ 1 + 4 ∗ 1 + 2 ∗ 1 + 1 ∗ 1 = 15 = F 1 1 1 1 = 2^3*1 + 2^2*1 + 2^1*1 + 2^0*1 =8*1 + 4*1 + 2*1 + 1*1 =15 =F 1111=231+221+211+201=81+41+21+11=15=F

  • 进制转换

    • 1位八进制数 = 3位二进制数
    • 1位十六进制数 = 4位二进制数
    • 八进制转十六进制,先转换为二进制数
  • C语言中进制表示

    进制表示
    二进制C语言不能直接写二进制数
    八进制以数字0开头,0~7
    十进制以数字1-9开头,0~9
    十六进制以0x / 0X开头,09和AF
  • eg:

    #include <stdio.h>
    
    int main()
    {
        int a, b, c;
        a = 123;
        b = 0123;
        c = 0x123;
        printf("[10]%d\n[8]%o\n[16]%x\n", a, b, c);
        return 0;
    }
    
原反补码
  • 数据在计算机中主要以补码形式存储
术语含义
bit(比特,位)一个二进制数(0/1)表示一位,数据传输以“位”为单位
Byte(字节)一个字节为8个二进制数(8位),计算机中存储最小单位位字节,数据存储习惯以“字节”为单位
WORD(双字节,字)2个字节,16位
DWORD两个WORD,4个字节,32位
1 b1 bit,1位
1 B1 Byte,1字节,8位
1 k,1 K1024
1 M(1兆)1024 k,1024*1024
1 G1024 M
1 T1024 G
1 Kb(千位)1024 bit,1024位
1 KB(千字节)1024 Byte,1024字节
1 Mb(兆位)1024 Kb = 1024*1024 bit
1 MB(兆字节)1024 KB = 1024*1024 Byte
  • 存储1字节(8位)大小的数字(char)

    • 原码(用户角度):原始的二进制
      • 用户的数字分正负数,利用符号位
      • 最高位(左起第一位)为符号数:0代表正数,1代表负数
      • 导致的问题
        1. 0有两种存储方式
        2. 正数和负数相加,结果不正确(计算机只会加法运算)
    • 反码(为了算补码)
      • 规定:正数的原码和反码一致,负数符号位不变,其他位取反(01互换)
      • 导致的问题
        1. 0有两种存储方式
    • 补码(为了存储负数)
      • 规定:正数的原码、反码和补码一致,负数为其补码+1
      • 解决的问题
        1. 统一0的存储编码
        2. 符号位和其他位统一处理
        3. 减法运算转变为加法运算
        4. 两个用补码表示的数相加,最高位(符号位)有进位则被舍去
    • 补码求原码:
      • 正数补码等于其原码
      • 负数符号位不变,其他按位取反,结果+1
  • eg:

    数字原码反码补码
    + 10 000 00010 000 00010 000 0001
    - 11 000 00011 111 11101 111 1111
    + 00 000 00000 000 00000 000 0000
    - 01 000 00001 111 11111 0 000 0000(最高位丢弃)
    1 - 1 = 1 + -11 000 0010 = -21 111 1111 = -01 0 000 0000 = -0 = 0
有符号和无符号的区别
  • 有符号数,最高位是符号位,1代表负数,0代表整数

  • 无符号数,最高位不是符号位,是数的一部分,不包含负数

  • -0当作2^x使用(最高位舍去)

    数据类型占用空间取值范围
    char1字节-128127(-2^72^7-1)
    short2字节-3276832767(-2^152^15-1)
    int4字节-21474836482147483647(-2^312^31-1)
    long4字节-21474836482147483647(-2^312^31-1)
    unsigned char1字节0255(02^8-1)
    unsigned short2字节065535(02^16-1)
    unsigned int4字节04294967295(02^32-1)
    unsigned long4字节04294967295(02^32-1)
  • eg:

    #include <stdio.h>
    
    int main()
    {
    	char a = 0xff; //[signed] char
        unsigned char b = 0xff;
        //原:1 111 1111 反:1 000 0000 补:1 000 0001
        printf("signed char:%d\n", a); //-1
        //原:1 111 1111 反:1 111 1111 补:1 111 1111
        printf("unsigned char:%u\n", b); //255,输出结果以格式控制符为准
        return 0;
    }
    
  • 赋值或者运算,不要越界

    #include <stdio.h>
    
    int main()
    {
        char a = 127 + 2; //129
        //补码:1 000 0001 取反
        //反码:1 111 1110 +1
        //原码:1 111 1111 -127
        printf("%d\n", a); //-127 
        unsigned char b = 255 + 2; //257
        //补码:1 0 000 0001 取反(只取后8位)
        //反码:1 0 000 0001 
        //原码:1 0 000 0001 
    	//warning: large integer implicitly truncated to unsigned type [-Woverflow]
        //隐式截断为无符号类型的大整数
        printf("%u\n", b); //1
        return 0;
    }
    
sizeof关键字
  • sizeof不是函数,不用包含头文件,作用为计算一个数据类型的大小,单位为字节

  • sizeof返回值位size_t,size_t在32位操作系统试下是unsigned int(无符号整型)

  • eg:

    #include <stdio.h>
    
    int main()
    {
        float a;
        double b;
    	printf("char:%ld\nint:%ld\n", sizeof(char), sizeof(int)); //1 4
        printf("float:%ld\ndouble:%ld\n", sizeof(a), sizeof(b)); //4 8
        int len = sizeof(a);
        print("%d", len); //4
    	return 0;
    }
    
整型:int
  • 整型变量的输入和输出

    格式控制字符含义
    %o一个八进制的int类型数
    %x一个十六进制的int类型数,输出字母小写
    %X一个十六进制的int类型数,输出字母大写
    %u一个无符号的十进制的int类型数
    %hu一个无符号的十进制的short类型数
    %lu一个无符号的十进制的long类型数
    %llu一个无符号的十进制的long long类型数
    %d一个有符号的十进制的int类型数
    %hd一个有符号的十进制的short类型数
    %ld一个有符号的十进制的long类型数
    %lld一个有符号的十进制的long long类型数
  • eg:

    #include <stdio.h>
    
    int main()
    {
    	short a;
    	int b;
    	long c;
    	long long d;
    	printf("Please input a, b, c, d:");
    	scanf("%hd%d%ld%lld", &a, &b, &c, &d);
    	printf("%hd, %u, %o, %x, %X\n", a, a, a, a, a);
    	printf("%d, %u, %o, %x, %X\n", b, b, b, b, b);
    	printf("%ld, %lu, %lo, %lx, %lX\n", c, c, c, c, c);
    	printf("%lld, %llu, %llo, %llx, %llX\n", d, d, d, d, d);
    	return 0;
    }
    
  • 几种整型比较

    数据类型占用空间
    short(短整型)2个字节
    int(整型)4个字节
    long(长整型)windows为4个字节,linux 32位位4个字节,linux 64位为8个字节
    long long(长长整型)8个字节
字符型:char
  • 字符型变量的输入和输出

    数据类型占用空间
    char1个字节
    格式控制字符含义
    %c一个char类型字符
    • 内存中没有字符,只有数字,一个数字对应一个ASCII码

      man ascii //linux 查看ASCII表
      
    • 定义时单引号只包含一个字符(转义字符除外),用数字或者字符赋值等价

    • 字符类型本质上为1个字节大小的整型

    • 小写字母比大写字母大32

  • eg:

    #include <stdio.h>
    
    int main()
    {
    	char a = 97;
    	char b = 'a';
    	printf("a=%c,b=%c\n", a, b); //a a
    	printf("a=%d,b=%d\n", a, b); //97 97
    	char c = 'a';
    	char d = 'A';
    	printf("a=%d,A=%d\n", c, d); //97 65
    	return 0;
    }
    
转义字符
  • 由反斜杠\组成的多个字符

    转义字符含义ASCII码
    \a警报007
    \b退格(BS),将当前位置移到前一列008
    \f换页(FF),将当前位置移到下一页开头012
    \n换行(LF),将当前位置移到下一行开头010
    \r回车(CR),将当前位置移到本行开头013
    \t水平制表(HT),跳到下一个TAB位置009
    \v垂直制表(VT)011
    \\代表 \092
    \’代表 ’039
    \"代表 "034
    ?代表 ?063
    \0s数字 0000
    \ddd八进制转义字符,d范围0~73位八进制数
    \xhhs十六进制转义字符,h范围09、af、A~F2位十六进制数
实型(浮点型):float、double
  • 浮点型变量的输入和输出

    数据类型占用空间有效数字范围
    float4个字节7位有效数字
    double8个字节15~16位有效数字
    格式控制字符含义
    %f一个float单精度浮点型数
    %lf一个double双精度浮点型数
    • float存储不准确
  • eg:

    #include <stdio.h>
    
    int main()
    {
    	float a = 100.9f;
    	printf("%f\n", a); //100.900002
    	double b;
    	printf("Please input b:");
    	scanf("%lf", &b); //3.14
    	printf("%lf\n", b); //3.140000
    	return 0;
    }
    
类型限定符
限定符含义
extern声明一个变量,extern声明的变量没有建立存储空间
const定义一个常量,值不可修改
volatile防止编码器优化代码
register定义寄存器变量,提高效率,register建议型指令,如果CPU有空闲寄存器则生效
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值