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)使用位运算交换两个变量的值

复制代码
 1 #include<stdio.h>
 2  3 int main()
 4  5 {
 6  7 int a=10;
 8  9 int b=11;
10 11 printf("a=%d,b=%d\n",a,b);
12 13 a=a^b;
14 15 b=a^b;
16 17 a=a^b;
18 19 printf("a=%d,b=%d\n",a,b);
20 21 return 0;
22 23 }
复制代码

(2)使用位&运算符判断变量的奇偶性

复制代码
 1 #include<stdio.h>
 2  3 int main()
 4  5 {
 6  7 printf("请输入需要判断的整数:\n");
 8  9 int n;
10 11 scanf("%d",&n);
12 13 /* 14 15  if(n%2==0)
16 17  printf("这个数是偶数\n");
18 19  else
20 21  printf("这个数是奇数\n");
22 23 */ 24 25 if((n&1)==1)
26 27 printf("这个数是奇数\n");
28 29 else if((n&1)==0)
30 31 printf("这个数是偶数\n");
32 33 return 0;
34 35 }
复制代码

(3)编写一个函数,输出整数的二进制格式

复制代码
 1 #include<stdio.h>
 2  3 void putbinary(int number);
 4  5 int main()
 6  7 {
 8  9 printf("这个程序的作用是把你输入的整数以二进制的格式输出\n");
10 11 printf("请输入一个整数:\n");
12 13 int n;
14 15 scanf("%d",&n);
16 17  putbinary(n);
18 19 return 0;
20 21 }
22 23 24 25 void putbinary(int number)
26 27 {
28 29 //int count=sizeof(number)*8-1; 30 31 int count=(sizeof(number)<<3)-1;//注意这里需要注明优先级 32 33 printf("%d\n",count);
34 35 36 37 while(count>=0)
38 39 {
40 41 int value=(number>>count)&1;
42 43 printf("%d",value);
44 45 //每四个数字,打印一个空格 46 47 if(count%4==0)
48 49 printf(" ");
50 51 count--;
52 53 }
54 55 56 57 }
58 59 
复制代码

五、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。

帮助:输出一个\,使用\\,输出一个单引号使用\’,输出一个双引号,使用\"。

练习:编写一个函数,将小写字母转换为大写。

复制代码
 1 #include<stdio.h>
 2  3  4  5 char upper(char c)
 6  7 {
 8  9 if(c>='a'&&c<='z')
10 11 return c-('a'-'A');
12 13 else 14 15 return c;
16 17 }
18 19 int main()
20 21 {
22 23 char a=upper('b');
24 25 printf("%c\n",a);
26 27 return 0;
28 29 }
复制代码
目录
相关文章
|
12天前
|
Web App开发 监控 JavaScript
监控和分析 JavaScript 内存使用情况
【10月更文挑战第30天】通过使用上述的浏览器开发者工具、性能分析工具和内存泄漏检测工具,可以有效地监控和分析JavaScript内存使用情况,及时发现和解决内存泄漏、过度内存消耗等问题,从而提高JavaScript应用程序的性能和稳定性。在实际开发中,可以根据具体的需求和场景选择合适的工具和方法来进行内存监控和分析。
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
33 3
|
1月前
|
编译器 C语言
动态内存分配与管理详解(附加笔试题分析)(上)
动态内存分配与管理详解(附加笔试题分析)
49 1
|
7天前
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
|
17天前
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
116 9
|
20天前
|
C语言
【c语言】动态内存管理
本文介绍了C语言中的动态内存管理,包括其必要性及相关的四个函数:`malloc`、``calloc``、`realloc`和`free`。`malloc`用于申请内存,`calloc`申请并初始化内存,`realloc`调整内存大小,`free`释放内存。文章还列举了常见的动态内存管理错误,如空指针解引用、越界访问、错误释放等,并提供了示例代码帮助理解。
32 3
|
21天前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
1月前
|
程序员 编译器 C语言
动态内存分配与管理详解(附加笔试题分析)(下)
动态内存分配与管理详解(附加笔试题分析)(下)
46 2
|
1月前
|
编译器 程序员 C语言
深入C语言:动态内存管理魔法
深入C语言:动态内存管理魔法
|
1月前
|
存储 程序员 编译器
C语言——动态内存管理与内存操作函数
C语言——动态内存管理与内存操作函数