您的位置:首页 > 编程语言 > C语言/C++

黑马程序员——C语言—内存剖析

2015-03-18 23:49 155 查看
C语言第二篇---内存剖析

在C语言中,最关切,最密不可分的就是内存,无时无刻不与内存打着交道。内存里存放是数据,但

对于计算机而言,只有0和1,也就是所谓的二进制,学习到这里我非常的好奇啊,那么计算机是怎么把一

个画面优美,功能强大的程序拆成0和1运行的呢,先从进制开始。

在日常生活当中,我们计数都是十进制的,满10进1,在二进制中满2进1。并且在定义变量时,定义二

进制的变量要以 0B头,例如:0B01101,定义八进制以 0开头,例如:014,定义十六进制以0X开头,例

如:0X3ae ,虽然有很多的进制,但是计算机都会转成二进制存在内存中,那么计算机在内存中是这样存

储数据的。例如:

代码:int main()

{

int number=12;

int number2=13;

return 0;

}



在这段代码中,首先内存给先定义的number分配存储空间,优先把大空间给了number,地址从大往小

给number分配4个字节的内存,并将12的值转成二进制,一个字节存储8位,从大往小依次分配数据进去,

并且这个变量的地址就是4个字节中最上面最小的地址。接着再给number2分配空间,依次如上分配4个字节

的空间,并将数据遵循从大往小排。

看到这里才知道计算机是这样存储变量的值,内存跟我们息息相关,如何更合理的使用内存,short long

让我们更好的用内存,是数据比较小时可以用short修饰int,占据2个字节。数据大时可用long,占据8个字节。

关于printf输出我总结了以下几种:

1.%d或%i 输出十进制int类型或short类型

2.%o 输出八进制int类型

3.%x 输出十六进制int类型

4.%ld 输出十进制long int类型

5.%zd 输出unsigned类型

按位运算给我感觉就是更高效的处理一些计算,直接操作内存,非常有趣。按位运算符有:按位与、按位

或、按位异或、按位取反、左移、右移。

1.按位与:& 两个二进制数对应的位同是1则是1,否则是0。例如:

0000 0000 0000 0000 0000 0000 0010 0100 十进制:36

0000 0000 0000 0000 0000 0000 0001 0110 十进制:22

两个值按位与后结果是:

0000 0000 0000 0000 0000 0000 0000 0100 十进制:4

并且发现了一个规律,所有奇数的二进制末尾都是1,所有偶数的二进制末尾都是0.因此如果快速判断某个

数的奇偶性,可以用这个数按位与1,若为1,则这个数就是奇数,若为0,则这个数就是偶数。例如:

#include <stdio.h>

int main ()

{

int n=13;

int m=26;

if(n&1)

printf("n为奇数");

else

printf("n为偶数");

if(m&1)

printf("m为奇数");

else

printf("m为偶数");

}

2.按位或:两个二进制数对应的位有一个是1则是1,都是0则为0。例如:

0000 0000 0000 0000 0000 0000 0010 0100 十进制:36

0000 0000 0000 0000 0000 0000 0001 0110 十进制:22

两个值按位或结果是:

0000 0000 0000 0000 0000 0000 0011 0110 十进制:54

3. 按为异或:两个二进制数对应的位不相同则是1,否则为0。例如:

0000 0000 0000 0000 0000 0000 0010 0100 十进制:36

0000 0000 0000 0000 0000 0000 0001 0110 十进制:22

两个值按位异或结果是:

0000 0000 0000 0000 0000 0000 0011 0010 十进制:50

按位异或有以下特点:

1.相同的值异或等于0 9^9==0

2.任何值跟0异或等于本身 9^0==9

3.可交换异或的数值: a^b^c==a^c^b

4.综上所述,推断出:a^b^a==b

学到这里,我已经晕了,按位的运算符的功能太强大了,接下来学了左移,右移。又被折服了。左移就

是把将二进制位左移一位,末尾补0,利用到这一点,可以推出来一个运算,a*2的n次方。就是将a的二进

制位向左移n位,这样可以快速的算出结果,并且直接操作内存,节省了计算机的计算时间,可见左移的强

大。那么相对而言右移则是如果求a/2的2次方就是将a的二进制位向右移n位。但是要注意的就是右移几位,

首位按照符号位补齐。

字符就是char类型,可以存放一个字符,占据1个字节。以ASSIC值存储,0-128都有相对应的字符,其常

用的有26英文字母\n,\t,特殊符号等。需注意,只能存储单个字符。

总结:作为一个优秀的程序员,最关注的就是内存,程序的性能。而合理的使用内存可以达到我们的效

果,并且可以使性能提高,目前我知道的就是这么多,这只是个开始,我明的的重要性,我会朝着更深处挖掘。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: