c语言的内存分析
1、 进制
汉字:十一 十进制:11 二进制:1011 八进制:13
4种主要的进制:
①. 十进制:0~9
②. 二进制:0和1
③. 八进制:0~7
④. 十六进制:0~9+a b c d e f
%o :以不带符号的八进制输出
%x :以不带符号的十六进制输出
%u :以不带符号的十进制输出
%c : 输出字符
%p : 输出地址
%f : 输出小数
%s : 输出字符串
1> 判断下列数字是否合理
00011 0x0011 0x7H4 10.98 0986 .089 -109
+178 0b325 0b0010 0xFFdc 96f 96.0f 96.0F
-.003 15.4e6 10e8.7 7.6e-6
2> 分别写出它们的十进制、八进制、十六进制
0b0011 1101 0b0111 1011
3> 写出它们的二进制
67 056 0x004f
研究变量在内存中的具体存储情况
为了更好地理解变量在内存中的存储细节,先来认识一下内存中的“字节”和“地址”。
int b = 10;
int a = 134;
// 输出整数的二进制形式
1 #include <stdio.h> 2 int main() 3 { 4 void putBinary(int); 5 6 putBinary(-12); 7 8 putBinary(13); 9 10 return 0; 11 } 12 void putBinary(int n) 13 { 14 int bits = sizeof(n) * 8; 15 while (bits-->0) { 16 printf("%d", n>>bits&1); 17 if (bits%4==0) printf(" "); 18 } 19 printf("\n"); 20 }
n位二进制的取值范围
2位二进制位的取值范围:0~3 0~2的2次方-1
3位二进制位的取值范围:0~7 0~2的3次方-1
n位二进制位的取值范围:0~2的n次方-1
写出下列变量在内存中的存储情况
int a = 134;
int b = 0;
int c = -10;
1> short和long可以提供不同长度的整型数,也就是可以改变整型数的取值范围。在64bit编译器环境下,int占用4个字节(32bit),取值范围是-2的31次方~2的31次方-1;short占用2个字节(16bit),取值范围是-2的15次方~2的15次方-1;long占用8个字节(64bit),取值范围是-2的63次方~2的63次方-1
2> 总结一下:在64位编译器环境下,short占2个字节(16位),int占4个字节(32位),long占8个字节(64位)。因此,如果使用的整数不是很大的话,可以使用short代替int,这样的话,更节省内存开销。
3> 世界上的编译器林林总总,不同编译器环境下,int、short、long的取值范围和占用的长度又是不一样的。比如在16bit编译器环境下,long只占用4个字节。不过幸运的是,ANSI \ ISO制定了以下规则:
4> 可以连续使用2个long,也就是long long。一般来说,long long的范围是不小于long的,比如在32bit编译器环境下,long long占用8个字节,long占用4个字节。不过在64bit编译器环境下,long long跟long是一样的,都占用8个字节。
5> 还有一点要明确的是:short int等价于short,long int等价于long,long long int等价于long long
1> 首先要明确的:signed int等价于signed,unsigned int等价于unsigned
2> signed和unsigned的区别就是它们的最高位是否要当做符号位,并不会像short和long那样改变数据的长度,即所占的字节数。
只有对应的两个二进位均为1时,结果位才为1,否则为0。
只要对应的二个二进位有一个为1时,结果位就为1,否则为0。
1> 功能
当对应的二进位相异(不相同)时,结果为1,否则为0。
2> 举例: 比如9^5,其实就是1001^101=1100,因此9^5=12
3> 规律
对整数a的各二进位进行取反,符号位也取反(0变1,1变0)
1 #include <stdio.h> 2 int main() 3 { 4 int a = 10; 5 int b = 11; 6 a = a ^ b; 7 b = a ^ b; 8 a = a ^ b; 9 10 printf("a=%d, b=%d\n", a, b); 11 12 return 0; 13 }
1 #include<stdio.h> 2 int main() 3 4 { 5 6 printf("请输入需要判断的整数:\n"); 7 8 int n; 9 10 scanf("%d",&n); 11 12 13 if((n&1)==1) 14 15 printf("这个数是奇数\n"); 16 17 else if((n&1)==0) 18 19 printf("这个数是偶数\n"); 20 21 return 0; 22 23 }
1 #include <stdio.h> 2 void printBinary(int number); 3 4 int main() 5 { 6 printf("这个程序的作用是把你输入的整数以二进制的格式输出\n"); 7 8 printf("请输入一个整数:\n"); 9 10 int n; 11 12 scanf("%d",&n); 13 printBinary(n); 14 15 return 0; 16 } 17 18 void printBinary(int number) 19 { 20 21 // 记录现在挪到第几位 22 // (sizeof(number)*8) - 1 == 31 23 int temp = ( sizeof(number)<<3 ) - 1; 24 25 while ( temp >= 0 ) 26 { 27 // 先挪位,再&1,取出对应位的值 28 int value = (number>>temp) & 1; 29 printf("%d", value); 30 31 // 32 temp--; 33 34 // 每输出4位,就输出一个空格 35 if ( (temp + 1) % 4 == 0 ) 36 { 37 printf(" "); 38 } 39 } 40 41 printf("\n"); 42 }
ASCII单字节表(双字节GBK\GB2312\GB18030\Unicode)
char c = A;
char c = "A";
char c = 'ABCD';
char c = '男';
在-128~127范围内,可以当做整数来用
printf(“%d”, ‘A’);
printf(“%c”, 68);
转义字符 |
意义 |
ASCII码值 |
\n |
将当前位置移到下一行开头(回车换行) |
10 |
\t |
跳到下一个TAB位置 |
9 |
\\ |
代表一个反斜线字符 |
92 |
\' |
代表一个单引号字符 |
39 |
\" |
代表一个双引号字符 |
34 |
\0 |
空字符 |
0 |
1 #include <stdio.h> 2 char upper(char c) 3 { 4 // 如果是小写字母,就转成大写 5 /* 6 if (c>='a' && c<='z') { // ['a', 'z'] 7 return c - ('a'-'A'); 8 } else {// 如果不是小写字母,返回字母本身 9 return c; 10 }*/ 11 12 // 如果是小写字母,就转成大写 13 if (c>='a' && c<='z') { // ['a', 'z'] 14 return c - ('a'-'A'); 15 } 16 // 如果不是小写字母,返回字母本身 17 return c; 18 } 19 20 int main() 21 { 22 char cc = upper('h'); 23 24 printf("%c\n", cc); 25 return 0; 26 }
int main()
{
int i = 67 + '4';
char c = 'c' - 10;
printf("%d - %c\n", i, i);
printf("%d - %c\n", c, c);
return 0;
解 119 - w
89 - Y