C语言内存分析
C语言内存分析
一、进制
概念:进制是一种计数方式,是数值的表现形式
4种主要的进制:
①. 十进制:0~9
②. 二进制:0和1
③. 八进制:0~7
④. 十六进制:0~9+a b c d e f
C语言在默认的情况下为十进制。
Int num=1010;//十进制
Int num=0b1100;//二进制,以0b或者是0B开头
Int num=014;//八进制,以0开头
Int num=0x4;//十六进制,以0x开头
占位符:
%d和%i :一十进制整数的形式输出一个值
%o :以不带符号的八进制输出
%x :以不带符号的十六进制输出
%u :以不带符号的十进制输出
%c : 输出字符
%p : 输出地址
%f : 输出小数
%s : 输出字符串
N位二进制的取值范围:
2位···0~3 0~2的2次方-1
3位···0~7 0~2的3次方-1
N位··· 0~2的n次方-1
判断以下数据是否正确:
0x7h4 0986 .089 0b325 10e8.7 96f -.003
类型的取值:
在64位编译器下,int类型 占4个字节 共4x8=32bit char类型 占1个字节 共1x8=8bit ,在内存中以字节为单位进行存储。
二、内存分析
注意:内存寻址,由大到小。
Int a=1;
Int b=2;
三、类型说明符
Short== Short int %d 2
Long ==long int %ld 8
Long long ==Long long int %lld 8
Signed ==Signed int==int %d 4(有符号)
Unsigned ==Unsigned int %u 4(无符号)
Signed和unsigned的区别在于最高位要不要拿来作为符号位,显然后者的取值范围更大。这两个说明符可和long等说明符组合使用,但不会改变字节数。Unsigned代表int类型的最高位,不必用来作为符号位。
四、位运算
(一)按位与 &
功能:只有对应的两个二进制位均为1时,结果才为1,否则为0。
示例:9&5 的结果为1
1001
0101
——
0001
说明:如果位与上1则保留原值,与上0则为0。
应用:查询0101 0111 0000的倒数第六位是0还是1,则可以与上数值以判断,得出的结果是什么,那么它的原值就是什么。
0101 0111 0000
0000 0010 0000
0000 0010 0000
(二)按位或 |
功能:只要对应的两个二进制位有一个为1则结果为1,否则为0。
举例:9|5的结果为13
1001
0101
——
1101
(三)按位异或 ^
功能:当对应的两个二进制位不相等时,结果为1,否则为0。
举例:9^5的结果为:12
1001
0101
——
1100
规律:
①. 相同整数异或的结果为0,如5^5=0
②. 顺序可以交换。如9^5^9=9^9^5=0^5=5
③. 任何数值跟0进行异或,结果还是原来的数值。9^0=9
④. a^b^a==b
(四)按位取反 ~
举例:~9的结果为-10
0000 0000 0000 0000 0000 0000 0000 1001
1111 1111 1111 1111 1111 1111 1111 0110
(五)左移 <<
如a<<n
把整数a的二进制位全部左移n位,高位丢弃,低位补零。左移n位的结果其实是乘以2的n次方,由于符号位会被丢弃,所以结果可能会改变正负性。
举例:9<<1的结果为18
0000 1001
0010 0010
应用:如果某个数需要乘以2的n次方,那么使用位运算效率更高。
(六)右移 >>
如a>>n
把整数a的二进制位全部右移n位,低位丢弃,符号位不变,一般情况下高位用符号位补齐。右移的结果实际上是除以2的n次方。
(七)练习
(1)使用位运算交换两个变量的值
#include<stdio.h> int main() { int a=; int b=; printf("a=%d,b=%d\n",a,b); a=a^b; b=a^b; a=a^b; printf("a=%d,b=%d\n",a,b); return ; }
(2)使用位&运算符判断变量的奇偶性
#include<stdio.h> int main() { printf("请输入需要判断的整数:\n"); int n; scanf("%d",&n); /* if(n%2==0) printf("这个数是偶数\n"); else printf("这个数是奇数\n"); */ if((n&)==) printf("这个数是奇数\n"); else if((n&)==) printf("这个数是偶数\n"); return ; }
(3)编写一个函数,输出整数的二进制格式
#include<stdio.h> void putbinary(int number); int main() { printf("这个程序的作用是把你输入的整数以二进制的格式输出\n"); printf("请输入一个整数:\n"); int n; scanf("%d",&n); putbinary(n); return ; } void putbinary(int number) { //int count=sizeof(number)*8-1; int count=(sizeof(number)<<)-;//注意这里需要注明优先级 printf("%d\n",count); while(count>=) { int value=(number>>count)&; printf("%d",value); //每四个数字,打印一个空格 if(count%==) printf(" "); count--; } }
五、char类型
(一)基础
Char c=‘A’;
字符在内存中也是也二进制的格式存储的。
Int num=6;//在内存中以00···0110存储
Char num=‘6’;//对应的ascii码值是54=32+16+4+2,在内存中为11 0110
两者之间有着本质的区别,一个是具体的整数值,一个是字符,以ASCII格式存储。
(二)使用注意
单引号只能括住单字节的字符,ASCII中的所有字符都是单字节的。
Char c=’男’;//错误,因为一个汉字占据3个字节的存储空间
Char c=”A”;//错误,这是字符串,为‘A’+‘\0’。
Char c=65;//正确,另一种形式而已
Char类型占据一个字节,所以它的取值范围为-128~127。
帮助:输出一个\,使用\\,输出一个单引号使用\’,输出一个双引号,使用\"。
练习:编写一个函数,将小写字母转换为大写。
#include<stdio.h> char upper(char c) { if(c>='a'&&c<='z') return c-('a'-'A'); else return c; } int main() { char a=upper('b'); printf("%c\n",a); return ; }
C语言内存分析的更多相关文章
- c语言的内存分析
1. 进制 1. 什么是进制 ● 是一种计数的方式,数值的表示形式 汉字:十一 十进制:11 二进制:1011 八进制:13 ● 多种进制:十进制.二进制.八进制.十六进制.也就是说,同一个 ...
- Chrome开发者工具之JavaScript内存分析
阅读目录 对象大小(Object sizes) 对象的占用总内存树 支配对象(Dominators) V8介绍 Chrome 任务管理器 通过DevTools Timeline来定位内存问题 内存回收 ...
- [转载]JavaScript内存分析
https://github.com/CN-Chrome-DevTools/CN-Chrome-DevTools/blob/master/md/Performance-Profiling/javasc ...
- iOS开发——高级篇——内存分析,Instruments
一.内存分析 1.静态内存分析(Analyze)不运行程序,直接对代码进行内存分析,查看代码是否有内存泄露优点:分析速度快,并且可以对所有的代码进行内存分析缺点:分析结果不一定准确(没有运行程序,根据 ...
- C语言内存对齐详解
一.字节对齐基本概念 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型 ...
- C语言内存对齐详解(2)
接上一篇:C语言内存对齐详解(1) VC对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式.VC 中提供了#pr ...
- JS内存泄漏 和Chrome 内存分析工具简介(摘)
原文地址:http://web.jobbole.com/88463/ JavaScript 中 4 种常见的内存泄露陷阱 原文:Sebastián Peyrott 译文:伯乐在线专栏作者 - AR ...
- C语言内存对齐原理
一.什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这 ...
- 「C」关键字、标识符、注释、内存分析、数据、常量、变量
一.关键字 C语言提供的有特殊含义的符号,共32个. 一般在Xcode中关键字全部显示紫褐色,关键字全部都为小写.如int.return等. 二.标识符 标识符是程序员在程序中自定义的一些符号和名称. ...
随机推荐
- 一步一步学习IdentityServer4 (7) IdentityServer4成功配置全部配置
auth.liyouming.com 全部配 public class Startup { public Startup(IConfiguration configuration) { Configu ...
- 5.5版本以上”No input file specified“问题解决
.htaccess文件中的 RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] 在默认情况下会导致No input file specified. 修改成 Rewri ...
- pyinstaller 打包错误集锦
最近在用 pyinstaller 打包项目的时候遇到如下错误: RecursionError: maximum recursion depth exceeded 解决方案 执行 pyinstaller ...
- 深入理解Git - Git底层对象
前篇: 深入理解Git - 一切皆commit 如何从稍微底层一点的角度,从底层实现理解一切皆commit ? 配合希沃白板课件食用,效果更佳: [希沃白板5]课件分享 : <Git 进阶 - ...
- Chrome谷歌浏览器拓展组件的2种快速安装方法(.crx)
谷歌浏览器拓展有至少2种安装方法,现在简单的介绍下. 第一种.当然是进入谷歌官方的应用商店直接安装 这种方法简单快捷,而且官方支持度够高,唯一的缺点是大陆用户需要“FQ”. 谷歌拓展组件应用商店地址: ...
- python获取当前系统的桌面的路径
一,用内置的winreg(推荐) import winregdef get_desktop(): key = winreg.OpenKey(winreg.HKEY_CURRENT_USER,\ ...
- Linux驱动之IIC总线
<作用> 电子设备中有很多IIC设备之间需要进行相互通信,这样就产生了IIC总线,常用来实现设备之间的数据通信. <IIC总线结构> IIC总线只有两条线,一条是串行数据线 ...
- 求N!末尾所得数字0的个数
题目:给定一个整数N ,那么N 的阶乘N !末尾有多少个0呢? 例如:N = 10,N! = 3628800,所以N!末尾就有2个零. 分析:如果直接先算出N!阶乘,很容易导致内存溢出.显然,直接算出 ...
- 内容播放colorbox
1.需要的js (1)jquery (2)colorbox (http://www.jacklmoore.com/colorbox/ 下载文件夹,其中有js.css文件) //加载的时候注意文件的路径 ...
- poj3537 Crosses and Crosses 博弈论
大意: 给定一个\(1 * n\)的棋盘,你和对手轮流在上面画"X" 当出现三个连续的X时,最后一步操作的人胜利 不难发现,在棋盘中画了一个X之后 问题等价于两个一样的子游戏 然后 ...