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

来源:互联网 发布:ubuntu 主分区 编辑:程序博客网 时间:2024/06/06 10:39

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,特殊符号等。需注意,只能存储单个字符。

    

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

果,并且可以使性能提高,目前我知道的就是这么多,这只是个开始,我明的的重要性,我会朝着更深处挖掘。

 

0 0