2 C语⾔数据类型和变量

1 数据类型介绍

1.1字符型char,整形int,浮点型等等

说明:这些类型的数据最终都是以补码的形式存储在内存中,原码-反码-补码的计算,对于正数和无符号数来说,它的原反补码是一样的,对于负数的计算过程如下:

  • 计算负数的补码:把负数取绝对值,把绝对值的二进制即源码写出来要加上符号位

  • 然后全部取反再加1即可(符号位也要取反)。

  • 例子: 计算 -5 的补码

    补码规则:‌负数的补码 = 其绝对值的原码取反(符号位也要) + 1‌

    步骤:

    1. ‌取 +5 的原码‌: 0000 0101

    2. ‌按位取反‌(所有 0→1,1→0): 1111 1010

    3. ‌加 1

        1111 1010
      + 0000 0001
      ----------
        1111 1011

      最终补码:

      1111 1011
      0xFB//16进制
      char //character,一个字节(8个比特)大小,表示数据范围为-128~127,默认就是有符号的即比特位的最高位表示符号,0-正数,1-负数,
      [signed] char //有符号的
      unsigned char //⽆符号的
      
      1.2 整型
      //短整型
      short [int]//16个比特位表示数据的大小
      [signed] short [int]
      unsigned short [int]
      //整型
      int
      [signed] int//32个比特位4个字节
      unsigned int
      //⻓整型
      long [int]
      [signed] long [int]//64个比特位8个字节
      unsigned long [int]
      //更⻓的整型
      //C99中引⼊
      //浮点型 都是有符号的
      float //4个字节有符号
      double //8 个字节有符号
      long double

      2bool类型

      C?语⾔原来并没有为布尔值单独设置⼀个类型,⽽是使⽤整数 0 表⽰假,⾮零值表⽰真。 在 C99 中也引⼊了 布尔类型 ,是专⻔表⽰真假的。

      布尔类型的使⽤得包含头⽂件" <stdbool.h>" 布尔类型变量的取值是: true 或者 false

      #define bool _Bool
      #define false 0
      #define true 1

      3 sizeof 操作符

      sizeof 是⼀个关键字,也是操作符,专⻔是⽤来计算sizeof的操作符数的类型⻓度的,单位是字 节。 sizeof 操作符的操作数可以是类型,也可是变量或者表达式。

      sizeof( 类型 )//类型的花一定要加括号
      sizeof 表达式 //可以不用加括号,所以不是函数,函数一定要加括号
      #include <stdio.h>
      int main()
      {
      	int a = 10;
      	printf("%zd\n", sizeof(a));
      	printf("%zd\n", sizeof a); //a是变量的名字,可以省略掉sizeof后边的()
      	printf("%zd\n", sizeof(int));
      	printf("%zd\n", sizeof(3 + 3.5));
      	return 0;
      }

      sizeof 的操作数如果不是类型,是表达式的时候,可以省略掉后边的括号的。 sizeof 后边的表达式是不真实参与运算的,根据表达式的类型来得出⼤⼩。 sizeof 的计算结果是 size_t 类型的。

      sizeof 在代码进⾏编译的时候,就根据表达式的类型确定了,类型的常⽤,⽽表达式的执⾏却要在 程序运⾏期间才能执⾏,在编译期间已经将sizeof处理掉了,所以在运⾏期间就不会执⾏表达式了。

      4符号问题和数据取值问题

    4. 注意,C语⾔规定 char 类型默认是否带有正负号,由当前系统决定。这就是说, char 不等同于 signed char ,它有可能是 signed char ,也有可能是unsigned char 。这⼀点与 int 不同, int 就是等同于 signed int 。

      上述的数据类型很多,尤其数整型类型就有short、int、long、longlong四种,为什么呢?? 其实每⼀种数据类型有⾃⼰的取值范围,也就是存储的数值的最⼤值和最⼩值的区间,有了丰富的类 型,我们就可以在适当的场景下去选择适合的类型。如果要查看当前系统上不同数据类型的极限值: limits.h ⽂件中说明了整型类型的取值范围。float.h 这个头⽂件中说明浮点型类型的取值范围。 为了代码的可移植性,需要知道某种整数类型的极限值时,应该尽量使⽤这些常量。

      • SCHAR_MAX :signed char的最⼩值和最⼤值。
      • SHRT_MAX :short的最⼩值和最⼤值。
      • INT_MAX :int的最⼩值和最⼤值。
      • LONG_MAX :long的最⼩值和最⼤值。
      • LLONG_MAX :longlong的最⼩值和最⼤值。
      • UCHAR_MAX :unsigned char的最⼤值。
      • USHRT_MAX :unsigned short的最⼤值。
      • UINT_MAX :unsigned int的最⼤值。
      • ULONG_MAX :unsigned long的最⼤值。
      • ULLONG_MAX :unsigned long long的最⼤值。

      5变量的创建和分类

      5.1变量名称的问题

      /数据类型 变量名(即这个变量的地址,将来编译的时候变量名称都会变成地址,所以同一作用域不允许使用相同的变量名称)

      了解清楚了类型,我们使⽤类型做什么呢?类型是⽤来创建变量的。什么是变量呢?C语⾔中把经常变化的值称为变量,不变的值称为常量。变量创建的语法形式是这样的:

      data_type name;
      | |
      | |
      //数据类型 变量名(即这个变量的地址,将来编译的时候变量名称都会变成地址,所以同一作用域不允许使用相同的变量名称)
      int age; //整型变量
      char ch; //字符变量
      double weight; //浮点型变量
      
      //变量在创建的时候就给⼀个初始值,就叫初始化。不初始化那么就是随机值
      int age = 18;
      char ch = 'w';
      double weight = 48.0;
      unsigned int height = 100;

      变量的分类:

      全局变量:在⼤括号外部定义的变量就是全局变量 全局变量的使⽤范围更⼴,整个⼯程中想使⽤,都是有办法使⽤的。(extern 变量类型 变量名称) 局部变量:在⼤括号{ }也叫作用域内部定义的变量就是局部变量 局部变量的使⽤范围是⽐较局限,只能在⾃⼰所在的局部范围内使⽤的。

      #include <stdio.h>
      int global = 2023; //全局变量,如果其它源文件想使用改变量,extern int global 声明一个外部变量
      int main()
      {
      int local = 2018; //局部变量
      printf("%d\n", local);
      printf("%d\n", global);
       return 0;
      }
      //如果局部和全局变量,名字相同呢?
      #include <stdio.h>
      int n = 1000;
      int main()
      {
      int n = 10;
      printf("%d\n" n); 
      return 0;
      }
      //其实当局部变量和全局变量同名的时候,局部变量优先使⽤。

      5.2 extern关键字

    5. 声明外部变量,如果一个.c文件想使用另一个.c文件的中的全局变量或者函数,则可使用该关键字

    6. 一个.c文件的全局变量或者函数具有外部链接属性,通过extern即可链接使用,但是如果该全局变量或者函数被static修饰,则没有外部链接属性。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐