Maine

纵有疾风起,人生不言弃

1. C语言基础-数据类型

1.1 变量与常量

  1. 常量

程序运行过程中,其值不能改变的量。一般出现在表达式和赋值语句中,如:

// 常量不能改变值
10 = 2; // err
'a' = 'b'; // err
// ...

// 10, 3.14 'd' "hello maine" 都是常量
// 定义常量:
// 1. 宏定义
#define MAX 100
// 2. const
const int a = 10;
  1. 变量

程序运行期间可以改变的量。在编译的时候为其分配内存空间,可以通过名字或地址访问相应的内存空间。

int a;          // 定义变量,分配内存空间
a = 10;         // 变量赋值
char c = 'd';   // 初始化变量
extern int e;   // extern 声明变量,没有分配内存空间,不能赋值
// e = 10;       // 会报错,不能赋值
/**
    1. 命名:字母、数字、下划线组成,不能以数字开头
    2. {} 一个作用域内不能重复
    3. 不能是系统关键字
    4. 需要指定类型
    5. 变量名区分大小写
**/

1.2  进制

  1. C 语言如何表示进制数
// 10 进制(默认)
int a = 10;
// 16 进制 0x 开头
int b = 0xfff;
// 8 进制 0 开头
int c = 010;

printf("十进制: \d", a);
printf("八进制: \o", b);
printf("十六进制:  \x", c);
  1. 进制转换(略)

  2. 原码、反码、补码

计算机存储数据以二进制数存,一个字节占8位,最高位为符号位,0表示正数,1表示负数。计算机不能计算减法,只能算加法,所以减法会转换为加法。

原码:原始的二进制数。
存在问题:减法计算有误,0 的表示法冗余。
 1: 0000 0001;
-1: 1000 0001;
 0: 0000 0000;
-0: 1000 0000;
// 减法计算有误
1-1 -> 1 + (-1):
 0000 0001
+1000 0001
=1000 0010 = +2 ?

反码:解决原码减法计算错误。
基本原则:
1. 正数原码和反码一样。
2. 负数在原码基础上符号位不变,其他位取反(0变1,1变0)
 1: 0000 0001;  => 0000 0001;
-1: 1000 0001;  => 1111 1110;
 0: 0000 0000;  => 0000 0000;
-0: 1000 0000;  => 1111 1111;
1-1 -> 1 + (-1):
 0000 0001
+1111 1110
=1111 1111 (反码) = 1000 0000 (原码) = 0 (十进制)
解决了减法问题,但 0 重复问题没有解决。

补码:Ok。
基本原则:
1. 正数原码反码补码都一样。
2. 负数在反码基础上加 1。
 1: 0000 0001;  => 0000 0001;
-1: 1111 1110;  => 1111 1111;
 0: 0000 0000;  => 0000 0000;
-0: 1111 1111;  =>10000 0000; => (越界不保存) => 0000 0000;
1-1 > 1 + (-1):
  0000 0001;
+ 1111 1111;
=10000 0000; => 0000 0000 => 0

1.3 整型变量

定义和输入输出(常用):

// 整型 %d
int a;
printf("请输入a: ");
scanf("%d", &a);
printf("a = %d \n", a);

// 短整型 %hd
short b;
printf("请输入b: ");
scanf("%hd", &b);
printf("b = %d \n", b);

// 长整型 %lld 
long long c;
printf("请输入C: ");
scanf("%lld", &c);
printf("c = %lld \n", c);

/**
    %d => 有符号 10 进制 int 类型
    %o => 8 进制 int 类型值
    %x => 16 进制,字母小写输出
    %X => 16 进制,字母大写输出
    %u => 10 进制无符号输出
**/

1.4 字符类型

字符类型本质上是 1 字节的整型。

  /**
     * 1. 内存中没有字符,只有数字
     * 2. 一个字符对应一个数字,就是 ascii 码,unix 下可以使用 man ascii 查看
     * 3. 用字符或者用整型给字符类型赋值是等价的
     * 4. 字符要用单引号包裹
     */
    char a = 63;
    printf("a = %c \n ", a);

1.5 浮点型

C 语言中存储浮点型的有 float(单精度 4字节)和 double(双精度 8字节)。因为受有效范围限制,结果可能会不准确。

// 单精度浮点型 %f
float a;
printf("请输入a: ");
scanf("%f", &a);
printf("a = %f \n", a);

// 双精度浮点型 %lf
double b;
printf("请输入b: ");
scanf("%lf", &b);
printf("b = %lf \n", b);

1.6 类型限定符

  1. extren 声明一个变量,没有定义。
  2. const 定义常量。
  3. volatile 防止编译器优化代码。
  4. register 定义寄存器变量,提高效率。

1.7 输入输出

scanf() printf() getchar() putchar()

scanf()

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注