• C语言之变量和数据类型



    计算机处理的数据(诸如数字、文字、符号、图形、音频、视频等)都是以二进制的形式存放在内存中的;
    一个元器件是1Bit, 有0和1两种结果; 8Bit为1Byte, 是一个字节; 字节就是最小的可操作单位.

    变量(Variable)

    • 计算机先在内存中找一块区域,规定用它来存放整数,并起一个好记的名字,方便以后查找。然后我们就可以将整数放进这块区域.
    • 赋值是指把数据放到内存的过程。
    #include 
    int main()
    {
      /* 定义变量, 初始化, 再次赋值 */
      int a;
      a = 1;
      printf("%d\n", a);
      a = 2;
      printf("%d\n", a);
      a = 3;
      printf("%d\n", a);
    
      /* 定义变量并初始化 */
      int b = 123;
      printf("%d\n", b);
    
      /* 连续定义多个变量 */
      int c, d, e, f = 456, g = 789;
      printf("%d\n", f);
      printf("%d\n", g);
    
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 数据是放在内存中的,在内存中存取数据要明确三件事情:数据存储在哪里、数据的长度以及数据的处理方式。
    • 数据类型只在定义变量时指明,而且必须指明;使用变量时无需再指明,因为此时的数据类型已经确定了。

    数据类型

    • 在C语言中,每一种数据类型所占用的字节数都是固定的,知道了数据类型(指明了数据的解释方式),也就知道了数据的长度。
    • 数据类型只在定义变量时指明,而且必须指明;使用变量时无需再指明,因为此时的数据类型已经确定了。
    • puts (output string) 只能输出字符串,
    • printf (print format “格式化打印”)比 puts 更强,可以输出字符串、整数、小数、单个字符等,并且可以自己定义输出格式,例如:
      以十进制、八进制、十六进制形式输出;
      要求输出的数字占 n 个字符的位置;
      控制小数的位数。

    1.整型(printf输出)

    %u 表示按unsigned int格式输入或输出数据
    %hd用来输出 short int 类型,hd 是 short decimal 的简写;
    %d用来输出 int 类型,d 是 decimal 的简写;
    %ld用来输出 long int 类型,ld 是 long decimal 的简写。
    
    • 1
    • 2
    • 3
    • 4

    字节数: 2 ≤ short ≤ int ≤ long

    #include 
    int main()
    {
      /*
        short === short int
        至少占2个字节(2Byte == 16Bit)
        Bit只有两种状态: 0或1
       */
      short a = 0;
    
      /*
        int大于等于short
       */
      int b = 0;
    
      /*
        long 大于等于int
       */
      long c = 0;
      
      /*
        short, int, long的长度关系:2 ≤ short ≤ int ≤ long
        short 并不一定真的”短“,long 也并不一定真的”长“,它们有可能和 int 占用相同的字节数。
        short至少占2个字节.
        short 的长度不能大于 int,long 的长度不能小于 int。
      */
      unsigned int d = 54321;
      short e = 12345;
      printf("%u and %hd\n", d, e);
    
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    2.sizeof 获取占用字节数

    sizeof 变量名
    sizeof(数据类型)
    
    • 1
    • 2

    sizeof 用来获取某个数据类型或变量所占用的字节数

    二、八、十六进制

    #include 
    int main()
    {
      /* 二进制: 以0b或0B开头, 只含0和1 */
      int a = 0b1;
      int b = 0b10;
      int c = 0B11;
      int d = 0B0100;
      printf("二进制\n");
      printf("a = %d, b = %d, c = %d, d = %d\n", a, b, c, d);
    
      /* 八进制: 以数字0开头, 只含0到7 */
      a = 01;
      b = 010;
      c = 0100;
      d = 001000;
      printf("八进制\n");
      printf("a = %d, b = %d, c = %d, d = %d\n", a, b, c, d);
    
      /* 十六进制: 以0x或0X开头, 只含0到9再到f或0到F */
      a = 0xf;
      b = 0xf0;
      c = 0XF00;
      d = 0X0F000;
      printf("十六进制\n");
      printf("a = %d, b = %d, c = %d, d = %d\n", a, b, c, d);
    
      /* 进制的输出 */
      short e = 0b10;
      int f = 010;
      long g = 0x10;
      printf("e=%ho\n", e);
      printf("f=%o\n", f);
      printf("g=%lx\n", g);
      printf("g=%#lx\n", g); // ***
    
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    在这里插入图片描述

    printf格式化输出(包括无符号输出格式)

    常用整型有short、int、long三种类型,对应的输出格式如下表:
    在这里插入图片描述

    C语言中的符号位(正负)

    • C语言规定,把内存的最高位作为符号位。
    • C语言规定,在符号位中,用 0 表示正数,用 1 表示负数
      在这里插入图片描述
    • short、int 和 long 类型默认都是带符号位的,符号位以外的内存才是数值位
    • 不希望设置符号位,可以在数据类型前面加上 unsigned 关键字
    #include 
    int main()
    {
      int i = -1;
      printf("i = %d\n", i);
      // 无符号输出
      printf("i = %u\n", i); //符号位在第一位,负是1,正是0
    
      unsigned int j = -1;
      printf("j = %d\n", j);
      printf("j = %u\n", j); //符号位在第一位,负是1,正是0
    
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    内存中整数的加法

    加法和减法也可以合并为一种运算,就是加法运算,因为减去一个数相当于加上这个数的相反数.(5 - 3等价于 5 + (-3),10 - (-9)等价于10+9.)
    有符号数在存储和读取时都要进行转化

    • 正数的原码(整数的二进制形式)、反码、补码都是一样的

    • 负数的反码是原码取反,负数的补码是负数的反码加一

    • 内存中的计算方式:补码相加,结果的原码是具体数值。

    • 计算机内存数值存储方式是补码


    字符与字符串

    #include 
    int main(int argc, char **argv)
    {
      // 字符
      char a = 'a';
      putchar(a);
      putchar('\n');
      printf("%c %d\n", a, a);
    
      // 字符串
      char str1[] = "I'm a string1. ";
      char *str2 = "I'm a string2. ";
      puts(str1);
      printf("%s\n", str2);
    
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

  • 相关阅读:
    黑客(网络安全)技术自学——高效学习
    22.(地图工具篇)geoserver点服务图层SLD样式效果1
    EasyX图形库note4,动画及键盘交互
    PyTorch: 点燃深度学习革新之火
    数据库复制:开源工具和选项
    鸿蒙-实践课程四 android、HarmonyOS 日志处理
    等级保护——Linux命令大全
    防火墙ssh详解讲解
    Vue、React和小程序中的组件通信:父传子和子传父的应用
    Go实现LogCollect:海量日志收集系统【上篇——LogAgent实现】
  • 原文地址:https://blog.csdn.net/weixin_46372074/article/details/126658772