C 程序存储和运行时的几个区域
C 语言中有四个存储区
栈区
堆区
数据区
全局区(静态区)
常量区(字面量区)
代码区
我在网上找到了很多不同的版本,各有各的说法。最后,我觉得研究这个意义不大,因为不同的编译器有着不同的行为。但是,我们可以看到一些共通的地方。
栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。const 修饰的局部变量也是放在栈里的,而不是放在常量区!
堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由系统回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
数据区:包括静态全局区和常量区,因此其实可以分为五区,如果要站在汇编角度细分的话还可以分为很多小的区。
全局区(静态区,static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(bss 段,Block Started by Symbol)。程序结束后由系统释放。
常量区(注意是字面量 literal的意思,而不是 const 的意思):常量字符 ...
关于 unsigned 和 signed 类型相互转换的理解
12345678910111213141516171819202122#include <stdio.h>int main(int argc, char* argv[]){ unsigned char a = -1; // 【补码】-1表示为 1111 1111(省略n个1,看机器是多少位) char b = a; // signed char printf("%d %d", a, b); // 从unsigned转换为signed,所以 a 前面填 0,表示为 255(00..0011111111),而 b 前面填符号位,即 1,表示为 -1(全部位为 1) // 注意 printf 的时候也有一次转换 return 0;}// 结果:255 -1int main(int argc, char* argv[]){ unsigned short a = -1; // -1 表示为 1111 1111 1111 1111 1111 1111 1111 1111(32 位),给了 ...
关于补码的总结
原码:true code补码:complemental code反码:ones-complement
符号位都是用 0 表示「正」,用 1 表示「负」,而数值位,三种表示方法各不相同。
在计算机系统中,数值一律用补码来表示和存储。原因在于:
可以将符号位和数值位统一处理
加法和减法也可以统一处理
此外,补码与原码可以相互转换,其运算过程是相同的,不需要额外的硬件电路
可以理解为一个循环圈。
补码的特性
一个负整数的原码与其补码相加,和为模
对一个整数的补码再求补码,等于该整数自身
补码的正零与负零表示方法相同
整数的补码求给定数值的补码分以下两种情况:
正数正整数的补码是其二进制表示,与原码相同。
【例 1】+9 的补码是 00001001。(备注:这个 +9 的补码是用 8 位 二进制来表示的,补码表示方式很多,还有 16 位二进制补码表示形式,以及 32 位二进制补码表示形式吗,64 位进制补码表示形式等。每一种补码表示形式都只能表示有限的数字。)
负数求负整数的补码,将其对应正数二进制表示所有位取反(包括符号位,0 变 1,1 变 0)后加 1。同一个数字在不同的 ...
常见数据类型大小的总结
C 中变量为什么需要被指定类型?
变量的类型告诉编译器怎么处理这个变量的数据,指针加法运算
变量的类型告诉编译器要分配多少内存空间
数据类型特别是int相关的类型在不同位数机器的平台下长度不同。C99 标准并不规定具体数据类型的长度大小,只规定级别。什么是级别?比如int的大小不能超过long。
还有什么是字(word)?
字的大小等于 CPU 指令大小,即代表一次处理信息的能力 = 系统位,计算机从 32 位发展到 64 位的原因是寻址空间不足。
常见基本数据类型的大小单位:字节
16位
32位
64位
char
1
1
1
short
2
2
2
int 等于 unsigned int
4
4
4
long
4
4
8
long long
/
8
8
float
/
4
4
double
/
4
8
pointer
2
4
8
size_t
2
4
8
注意到int/long和float/double类似,long和double只有在 64 位下才变成 8 字节。
unsigned
signed
8位(1字节) ...
不靠谱的概率笔记(基本概念的理解)
概率的定义感觉学习概率最重要的是把握面积和比例,是理解概念、公式的法宝。
以新的视角看待问题不是一件令人激动的事吗?概率是面积(测度)!
测度(Measure)是一个函数,它对一个给定集合的某些子集指定一个数,这个数可以比作大小、体积、概率等等。传统的积分是在区间上进行的,后来人们希望把积分推广到任意的集合上,就发展出测度的概念,它在数学分析和概率论有重要的地位。测度论是实分析的一个分支,研究对象有 $\sigma$ 代数、测度、可测函数和积分,其重要性在概率论和统计学中都有所体现。
蒙提霍尔问题(Monty Hall Problem)问题:A、B、C 三扇门,其中只有一扇是正确的门,打开后将能获得一辆跑车,而另两扇门后只有山羊。在决定选择某扇门后,还剩两个选项,其中至少有一个是错误选择。此时,主持人(知道正确的答案是什么)打开了没被选中的门中错误的那个,让挑战者确认了门后是山羊,并问道:“是否要重新选择?”
仔细想一下以下两条规则:
如果第一次选择正确,重选必定错误($\frac{1}{3}$)
如果第一次选择错误,重选必定正确($\frac{2}{3}$ 即第一次选错的 ...
Python 中值得注意的几个问题
可变和不可变对象参考文章: 这里
可变:list, dict, set不可变:int, str, float, tuple
1234567891011121314151617181920212223def int_test(): # 不可变,会复制一份 i = 77 j = 77 print(id(77)) #140396579590760 print('i id:' + str(id(i))) #i id:140396579590760 print('j id:' + str(id(j))) #j id:140396579590760 print i is j #True j = j + 1 print('new i id:' + str(id(i))) #new i id:140396579590760 print('new j id:' + str ...
陷入多元微积「危机」分时写的笔记
多元函数多元函数:输入由多个变量构成的函数,是一个空间的点到另一个空间的点的映射。虽然输出由多个变量构成的函数也可被称为多元函数,但是它们通常被称为向量值函数。
导数(Derivatives): the rate of change of a function as you slightly tweak its input.积分(Integrals): how to add together infinitely infinitesimal quantities that make up a function’s output.
研究多元函数可以告诉我们在不同方向上函数值的变化情况,以及这些变化间的关系。
向量值函数(Vector-valued Functions or Vector Functions)定义域:标量 or 矢量值域:矢量
可用向量场(Vector Field)表示该函数:$f(x,y)=\left[\begin{aligned}F(x,y)\ G(x,y)\end{aligned}\right]$
可视化(Visualization)在多元函数中,我们并不总 ...
看不懂的微积分笔记
微积分探讨的三大思想:
Integrals 积分 $\int^R_0$
Derivatives 求导 $\frac{d}{dx}$
Fact that they are opposite 它们的关系
当你使用 $dt$ 时,你只是想表示 $dt\rightarrow 0$,它既不是「不穷小」,也不是 $0$。
$a^t$ 可以表示为 $e^{ct}$,其中$c=\ln a$。为什么选用 $e$ 而不是其他底?
$a^{kt} = k \times \ln a\times a^{kt}$ (多了 $\ln a$)
$e^{kt} = k \times e^{kt}$ ($k$ 即为变化率)
符合自然中的许多现象,变化率总是和变化量成正比:
人口增长
温度变化
金钱投资
位移 $s(t)$ 的导数:
$\frac{ds}{dt}$ Velocity
$\frac{d^2s}{dt^2}$ Acceleration
$\frac{d^3s}{dt^3}$ Jerk(急动度)
Chain Rule 的直观理解:
泰勒展开式每一项的系数可以 ...
Notes of Classical Logic | What is An Argument?
Pre-knowledgeCritical Thinking: the careful application of reason in the determination of whether a claim is true.
Premise (on Wiki): a premise is an assumption that something is true. (note that we can assume sth. to be false too)
$$Premise \subset Assumption$$
Assumption: presupposition, axioms, taking for granted.
Difference between hypothesis and assumption:
A hypothesis is a theory that seeks to explain a phenomenon or a set of phenomena. Scientists or researchers make up hypothesis to ...
子线程更新UI?这种情况呢?
问题是:今天研究到了一个有趣的问题,在这里先Mark一下。现在还是搞不懂!
1234567891011121314151617181920212223- (IBAction)touchButton:(id)sender{ NSLog(@"--------"); dispatch_queue_t queue = dispatch_get_global_queue(0, 0); dispatch_async(queue, ^{ NSURL *url = [NSURL URLWithString:@"https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/logo_redBlue.png"]; NSData *data = [NSData dataWithContentsOfURL:url]; UIImage *image = [UIImage imageWithData:data ...
《大学之路》读书笔记
一所好的大学,应该扮演四个角色。首先,它是培养人才的地方,将那些有潜力有志向的年轻人培养成对未来社会有所贡献的人;第二,它是一个研究的中心,引领世界科技的发展,并且会对一个国家、一个地区产生积极正面的影响;第三,它是一个新思想、新文化的发源地,能推动社会的进步;第四,它是年轻人的家,是他们度过人生最好时光的地方。
序一 | 我们需要什么样的大学 俞敏洪
真正的人,就是八个字,第一真实,第二善良,第三健康,第四快乐。
一个只懂得向学生灌输课程的大学充其量算得上三流,而那些能够点燃青年学生内心火焰的大学才真正称得上一流。
实践证明,没有好的通识教育,一个人的事业发展就不会有后劲。
大学不仅要有大师,还要有大楼(好的硬件条件),否则大师的教育理念就无法落地生根。
为什么我们不仅要上大学,还要努力上名校不可?原因很简单,要与优秀的人同行。
序二 | 培养终身学习的能力 Robert J. Spiller
To educate its students and cultivate their capacity for lifelong learning, to foster ...
究竟用 LinkedList L 还是 LinkedList *L?
C 语言的学习总是遇到各种问题,而且很多问题几乎离不开指针这鬼玩意。在学习数据结构与算法之蜜汁 C 语言版的时候,我也是被 LinkedList 这个东西弄得心累啊!
毕竟后面发现严蔚敏版的教材的代码应该是遵循 C++ 风格(我还没学过),里面充斥着LinkedList &L这种写法。然后,每次将代码 copy 到编辑器后,一编译就泪流满面。事实上,LinkedList &L是 C++ 的一种引用语法。
其实在参数中究竟用哪一种不重要,关键是知道自己在做什么(换句话说就是为什么要用它)?
接下来有必要先说一下链表的数据结构:
123456typedef int ElemType;typedef struct Node { ElemType data; struct Node *next;} Node, *LinkedList;
如上,需要注意的地方是 LinkedList 的身份是什么。在这里,*LinkedList等同于struct Node,换句话说,LinkedList等同于struct Node *,它是一个指向结构体Node的指针 ...