本文主要包括以下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)定义一个变量:创建一个变量,为其分配内存空间,并为它取名字(变量名),一个变量只能定义一次。