【linux c】Linux c内存管理——你的数据放在哪_学习笔记_009

来源:互联网 发布:t型匹配网络 ads 编辑:程序博客网 时间:2024/06/06 22:19

 本文主要包括以下6个知识点:计算机存数单位,各数据类型的字节长度,原码和补码,变量的三大特点,变量存储以及内存分配,声明和定义的区别。

 

1.计算机存储单位

计算机常用的存储单位有 位、字节、半字、字。换算公式如下:

1个字节 = 8位

1个半字 = 2个字节

1个字 = 4个字节

 

2.各数据类型的字节长度

(1)在不同编译器中,给各数据类型分配的空间会有所不同,本文以linux为例,单位为字节。

①int    4

②short 2

③long   4

④long long   8

⑤float 4

⑥double   8

⑦char   1

 

(2)指针的存储空间与普通类型不同,如下:

①int *

②short *

③long *

④long long *

⑤float *

⑥double *

⑦char *

以上所有类型的存储空间均为4个字节


原因:

每个指针保存的是地址,地址的长度是固定的,由操作系统确定。32bit的操作系统为4个字节,64bit的操作系统为8个字节。

 

3.原码和补码

(1)原码

原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。比如如果是8位二进制:

[+1]原 = 0000 0001

[-1]原 = 1000 0001

原码是人脑最容易理解和计算的表示方式。


(2)补码

在计算机系统中,数值一律用补码存储。

为什么用补码来存储呢,原因在于:

使用补码,可以将符号位和其他位统一处理,减法也可按加法来处理;另外两个用补码表示的数相加时,如果最高位(有符号)有进位,则进位被舍弃(如char类型有8位,-128的补码为1000 0000)。


(3)小结与计算(以下均以8位为例)

①正数的补码与其原码一致;

②负数补码的符号位为1,其余位为该数绝对值的原码取反,然后整个数加1。

③按照负数的补码规则,可以知道,-1的补码为0xff,-2的补码为0xfe。

-128 -1

= -128 + (-1)

= 1000 0000 + 1111 1111

= 0111 1111

= 127


(4)补充知识点:

①常量为有符号位,~ 2 = -3。

②2的补码:0000 0010;

取反后得:1111 1101,符号位为1,可知是负数;

符号位不动,其余为取反并加1,得 1000 0011,为-3。

 

4.变量三大特点:

(1)变量的数据类型:主要说明变量占用内存空间的大小;

(2)变量的作用域:变量有效的使用范围;

(3)变量存储的类别:变量在内存中的存储的方式,不同的存储方式,影响变量在内存中的生存方式。

 

5.变量存储以及内存分配:

(1)初步理解:

打开程序,内存中就有了一个进程。对于进程来说,操作系统给每个进程都分配了4G的内存空间,但是进程不会用到4G的空间,实际用到的物理内存可能是20M。就好比1个人住在100平米的房间,而人每次活动实际占的空间只有1平米。


(2)内存空间的分配:

内存空间主要分为5段:内核段,栈空间,堆空间,数据段,代码段。

栈空间

存放局部变量,函数形参,自动变量

堆空间

运行时可以动态分配的内存区域,通过 malloc, ralloc,calloc,free等库函数,可以在运行期间向系统申请一段内存,申请到的内存空间就位于堆区上。

数据段

·未初始化的全局变量.bss:存放没有初始化和初始化为0的全局变量。

·常量数据.rodata:存放常量。

·初始化过的全局变量.data:(静态数据区)初始化为非零的全局变量,static修饰的变量。

代码段

代码段保存源代码的地址(代码段的地址不可以修改)。


(3)栈空间和堆空间的特点:

栈空间

①先进后出(最先输入的数据最后释放),管理权限是系统。

②若变量未初始化,随机分配一个垃圾值

堆空间

①先进先出,管理权限是用户。

②若变量未初始化,则初始化为0;

 

6.声明与定义的区别:

(1)声明一个变量:告知编译器,这个名字(变量名)已经匹配在一块内存上了,但是并未为其分配内存。

(2)定义一个变量:创建一个变量,为其分配内存空间,并为它取名字(变量名),一个变量只能定义一次。

0 0
原创粉丝点击