C语言基础:基本数据类型

文章目录

    • 数据类型
        • 关键字
        • 常量与变量
        • 进制
        • 原反补码
        • 有符号和无符号的区别
        • sizeof关键字
        • 整型:int
        • 字符型:char
        • 转义字符
        • 实型(浮点型):float、double
        • 类型限定符

数据类型

编译器预算变量(对象)分配的内存空间大小
C语言基础:基本数据类型_第1张图片

关键字

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 
        
        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 
    #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 
    
    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 b 1 bit,1位
1 B 1 Byte,1字节,8位
1 k,1 K 1024
1 M(1兆) 1024 k,1024*1024
1 G 1024 M
1 T 1024 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:

    数字 原码 反码 补码
    + 1 0 000 0001 0 000 0001 0 000 0001
    - 1 1 000 0001 1 111 1110 1 111 1111
    + 0 0 000 0000 0 000 0000 0 000 0000
    - 0 1 000 0000 1 111 1111 1 0 000 0000(最高位丢弃)
    1 - 1 = 1 + -1 1 000 0010 = -2 1 111 1111 = -0 1 0 000 0000 = -0 = 0

有符号和无符号的区别

  • 有符号数,最高位是符号位,1代表负数,0代表整数

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

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

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

    #include 
    
    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 
    
    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 
    
    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 
    
    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

  • 字符型变量的输入和输出

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

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

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

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

  • eg:

    #include 
    
    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
    \0 s数字 0 000
    \ddd 八进制转义字符,d范围0~7 3位八进制数
    \xhh s十六进制转义字符,h范围09、af、A~F 2位十六进制数

实型(浮点型):float、double

  • 浮点型变量的输入和输出

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

    #include 
    
    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有空闲寄存器则生效

你可能感兴趣的:(C,C)