黑马程序员——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,特殊符号等。需注意,只能存储单个字符。
总结:作为一个优秀的程序员,最关注的就是内存,程序的性能。而合理的使用内存可以达到我们的效
果,并且可以使性能提高,目前我知道的就是这么多,这只是个开始,我明的的重要性,我会朝着更深处挖掘。
在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,特殊符号等。需注意,只能存储单个字符。
总结:作为一个优秀的程序员,最关注的就是内存,程序的性能。而合理的使用内存可以达到我们的效
果,并且可以使性能提高,目前我知道的就是这么多,这只是个开始,我明的的重要性,我会朝着更深处挖掘。
相关文章推荐
- 黑马程序员——C语言内存剖析
- 黑马程序员——C语言——函数、内存剖析
- 黑马程序员 -- IOS C语言 内存剖析1
- 黑马程序员——C语言内存剖析
- 黑马程序员 -- IOS C语言 内存剖析2
- 黑马程序员---C语言之进制与内存剖析
- 黑马程序员——C语言-2:内存剖析
- 黑马程序员——C语言基础---内存剖析
- 黑马程序员--IOS入学学习--3-函数及内存剖析
- 黑马程序员---C语言 内存分区
- 黑马程序员-IOS-C语言基础-函数及内存剖析
- 黑马程序员——零基础学习iOS开发——05 C语言:进制、内存储存细节、类型说明符、位运算、数组
- 黑马程序员 - C语言 -手动管理内存快速入门
- 黑马程序员-3-C语言学习(内存剖析,进制)
- 黑马程序员——C语言学习笔记03 变量在内存中存储的细节、位运算
- 黑马程序员------C语言-----进制与内存
- 黑马程序员---C语言:关于内存的分布
- 黑马程序员-内存剖析,进制转换和格式控制符
- 黑马程序员——【C语言】输出整数在内存中的二进制形式
- 黑马程序员_第三天视频学习 函数和内存剖析