当前位置:网站首页>鹏哥C语言第六节课

鹏哥C语言第六节课

2022-07-26 10:36:00 竹某

一.原码,反码,补码

整型数在C语言以二进制码形式存储。无符号整型的二进制码无符号位,只有数值位;有符号整型的二进制码的最高位为符号位,之后的为数值位。0代表整数,1代表负数。正整型数以补码(正整型数的原码反码和补码相同)形式存储,而负整型数以补码形式存储。

由有符号整型数的字面值到原码:

        符号为+,符号位为0;

        符号为-,符号位为1。

正整型数的原码反码和补码相同。而负整型数的原码除了符号位之外,按位取反,得到反码;反码加1,得到补码。

负整型数在内存中以补码形式存储,这是为了方便加法(减法)运算。但是在翻译为字面量时,使用的是原码(会把补码译为原码)。

比如下面的代码:

#include <stdio.h>
int main() {
	int a = 0;//00000000 00000000 00000000 00000000
	int b = ~a;   //这个赋值语句的意思是“11111111 11111111 11111111 11111111”是b在内存中的形式(补码)
	printf("%d\n",b);//结果是-1
	return 0;
}

二.auto,register,static关键字,typedef关键字初步用法

typedef:类型(重)定义操作符。

一个最简单的作用就是重定义类型

typedef unsigned int u_int;
unsigned int a = 10;//unsigned int可能过于长
//等价于 u_int a = 10;

//使用typedef的一个常见的错误是把它与#define混淆,之后没有加;

关于这个重定义的使用范围的问题暂且不做讨论。

auto:所有的局部变量默认为自动(automatic)变量。意即:进入作用域自动创建,出作用域自动销毁。如:auto int a=10;但是auto一般省略。如此看来,auto只适用于局部变量,体现了局部变量的生命周期和其作用域的关系。

static:有三种情况。

        1.修饰局部变量

区别于auto,改变了局部变量的生命周期。使局部变量一经创建,就能存活到程序结束。 

        2.修饰全局变量

改变了局部变量的作用域。是全局变量只能在定义它的源文件中使用。这对于多文件编程设置文件之间变量访问权限时很有用

        3.修饰函数

类似于全局变量。改变了函数的链接属性。能被定义它的之外的源文件调用,称为函数的外部链接属性;只能被定义它的源文件调用,称为函数的内部链接属性。

函数也要先声明后使用,且函数默认是可外部链接的。在其前加static取消了其外部链接属性,使其成为了一个内部链接函数。

(从这里的学习可以发现,之前关于局部变量生命周期的理解是不正确的:之前认为局部变量的生命周期从进入其作用域开始,到离开其作用域结束。这是不全面的,没有考虑static修饰的情况)

//源1.cpp
int sum(int a, int b) {
	return a + b;

}
int a = 10;
//源2.cpp
#include <stdio.h>
int sum(int, int);//函数和变量均要先声明后使用
extern int a;
int main() {
	
	printf("%d\n",sum(1,2));
	printf("%d\n",a);
	return 0;
}

//正确,可以运行
//若为sum和a加上static关键字,在运行源2.cpp时会产生无法解析错误
//源1.cpp
static int sum(int a, int b) {
	return a + b;

}
static int a = 10;

三.#define定义宏

#define前面被用于定义标识符常量。现在用于定义宏。宏可以用来代替一些简单的函数。

#include <stdio.h>
#define MAX(X,Y) X>Y?X:Y
int main(){
    int max=MAX(1,2);
    printf("%d\n",max);
    return 0;
}

更深入的放在之后

四.指针和地址的由来

首先介绍地址的由来。操作系统分为32位和64位。以32位操作系统为例,32位意味着32根地址线。32根地址线意味着有2^32个不同的地址。这些地址对应着唯一确定的内存单元。每一个这样的地址单元为1 byte,这样一来,2^32个内存单元意味着4G的内存。

这就是地址的由来。

下面介绍指针。指针是用来存储地址的变量。指针变量的数据类型可以为:int*, char*, double*等等。指针变量占用内存取决于操作系统类型,64位系统的指针占用8bytes,32位系统的指针占用4bytes。相关的操作符有:&取地址符;*间接访问操作符(解引用操作符)

原网站

版权声明
本文为[竹某]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_46345928/article/details/119452483