内存分析主要包括以下几部分内容:进制、类型说明符、位运算和关于char类型的一些内容。
一、 进制(二进制、八进制、十进制、十六进制)
1、二进制
① 特点:只有0和1,逢2进1
② 书写格式:0b或者0b开头
③ 使用场合:二进制指令\二进制文件,变量在内存中就是二进制存储
④ 二进制和十进制的互相转换
⑤ n为二进制位所能表示的数据范围(不考虑负数):0~2的n次方-1
2、八进制
① 特点:0~7,逢八进一
② 书写格式:0开头
③ 八进制和二进制的互相转换
3、 十六进制
① 特点:0~F,逢十六进一
② 书写格式:0x或者0X开头
③ 十六进制和二进制的互相转换
1 //代码举例
2 #include <stdio.h>
3
4 /*
5 %d\%i 十进制形式输出整数
6 %c 输出字符
7 %p 输出地址
8 %f 输出小数
9 %o 八进制形式输出整数
10 %x 十六进制形式输出整数
11
12 */
13
14 int main()
15 {
16 // 默认情况下,就是十进制
17 int number = 12;
18
19 // 二进制(0b或者0B开头)
20 int number2 = 0B1100;
21
22 // 八进制(0开头)
23 int number3 = 014;
24
25 // 十六进制(0x或者0X开头)
26 int number4 = 0xc;
27
28 // %d以10进制整数的形式输出一个数值
29 printf("%x\n", number);
30
31 return 0;
32 }
二、类型说明符
1、 short和long型
① short和long可以提供不同长度的整型数,也就是可以改变整型数的取值范围。在64bit编译器环境下,int占用4个字节(32bit),取值范围是-231~231-1;short占用2个字节(16bit),取值范围是-215~215-1;long占用8个字节(64bit),取值范围是-263~263-1
② 在64位编译器环境下,short占2个字节(16位),int占4个字节(32位),long占8个字节(64位)。因此,如果使用的整数不是很大的话,可以使用short代替int,这样的话,更节省内存开销。
1 //代码举例
2 // int 4个字节 %d
3 // short 2个字节 %d
4 // long 8个字节 %ld
5 // long long 8个字节 %lld
6 #include<stdio.h>
7
8 int main()
9 {
10 // long == long int
11 long int a = 100645654654645645l;
12 long a2 = 100645654654645645l;
13
14 // long long int == long long
15 long long int c = 100645654654645645ll;
16 long long c2 = 4535435435435ll;
17
18 // short == short int
19 short int d = 5454;
20 short d2 = 43434;
21
22 //printf("%lld\n", c);
23
24 int s = sizeof(long long int);
25 printf("%d\n", s);
26 return 0;
27 }
2、signed和unsigned
① signed int等价于signed,unsigned int等价于unsigned
② signed和unsigned的区别就是它们的最高位是否要当做符号位,并不会像short和long那样改变数据的长度,即所占的字节数。
③ signed:表示有符号,也就是说最高位要当做符号位,所以包括正数、负数和0。其实int的最高位本来就是符号位,已经包括了正负数和0了,因此signed和int是一样的,signed等价于signed int,也等价于int。signed的取值范围是-231 ~ 231 - 1
④ unsigned:表示无符号,也就是说最高位并不当做符号位,所 以不包括负数。在64bit编译器环境下面,int占用4个字节(32bit),因此unsigned的取值范围是:0000 0000 0000 0000 0000 0000 0000 0000 ~ 1111 1111 1111 1111 1111 1111 1111 1111,也就是0 ~ 232 - 1
1 //代码举例
2 #include<stdio.h>
3 // signed
4 // unsigned %u
5
6 int main()
7 {
8 // 0000 0000 0000 0000 0000 0000 0000 0000
9 // 2的31次方-1
10 // 2的32次方-1
11 int num;
12
13 /*
14 signed和unsigned的区别:
15 signed 最高位要当做符号位
16 unsigned 最高位不要当做符号位
17 */
18 // signed == signed int
19 // signed 有符号:正数、0、负数
20 signed int a = 10;
21 signed a2 = 10;
22
23 // unsigned int == unsigned
24 // unsigned 无符号:0、正数
25 unsigned int b = 10;
26 unsigned b2 = 10;
27
28 long unsigned int c = 34343;
29 long unsigned c2 = 423432;
30
31 short unsigned int d = 4343;
32 short unsigned d2 = 43243;
33
34 short signed int e = 54354;
35 short signed e2 = 434;
36
37
38
39
40 return 0;
41 }
三、 位运算
1、按位与(&)
只有对应的两个二进位均为1时,结果位才为1,否则为0
1 /* 按位与 &
2
3 10101010000
4 00000100000
5 -------------
6 00000000000
7
8 10111011
9 10101101
10 ---------
11 10101001
12
13 1001
14 0101
15 -----
16 0001
17 */
2、按位或(|)
只要对应的二个二进位有一个为1时,结果位就为1,否则为0
1 /*
2 按位或 |
3 1001
4 0101
5 -----
6 1101
7 */
3、按位异或(^)
当对应的二进位相异(不相同)时,结果为1,否则为0
1 /*
2 按位异或 ^
3 1.相同数值进行异或,结果肯定是0,比如9^9
4 2.交换 9^5^6 == 9^6^5
5 3.任何数值跟0进行异或,结果还是原来的数值,9^0 == 9
6 4.a^b^a == a^a^b == 0^b == b
7
8 1001
9 0101
10 -----
11 1100
12
13 1001
14 1001
15 -----
16 00000
17
18 0101
19 0000
20 ----
21 0101
22
23 9^5^9 == 9^9^5 = 0^5 = 5
24
25 a^b^a == b
26 */
4、取反(~)
对整数a的各二进位进行取反,符号位也取反
1 /*
2 按位取反 ~
3 ~0000 0000 0000 0000 0000 0000 0000 1001
4 1111 1111 1111 1111 1111 1111 1111 0110
5 */
5、<<左移
把整数a的各二进位全部左移n位,高位丢弃,低位补0。左移n位其实就是乘以2的n次方
由于左移是丢弃最高位,0补最低位,所以符号位也会被丢弃,左移出来的结果值可能会改变正负性
1 /*
2 左移 <<
3
4 0000 0000 0000 0000 0000 0000 0000 0000
5 00 0000 0000 0000 0000 0000 0000 100100
6
7 9<<1 -> 9 * 2的1次方 == 18
8 9<<2 -> 9 * 2的2次方 ==36
9 9<<n -> 9 * 2的n次方
10 */
6、>>右移
把整数a的各二进位全部右移n位,保持符号位不变。右移n位其实就是除以2的n次方
为正数时, 符号位为0,最高位补0
为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定
1 /*
2 右移 >>
3 0000 0000 0000 0000 0000 0000 0000 0000
4 000000 0000 0000 0000 0000 0000 0000 10
5 111111 1111 1111 1111 1111 1111 1111 10
6
7 8>>1 -> 8/2 == 4
8 8>>2 -> 8/2的2次方 == 2
9 8>>n -> 8/2的n次方
10 */
四、char类型
用单引号表示单字节的字符
1 // 单引号''只能扩住单字节的字符
2 char c = '男'; // 错误写法
3
4
5 char c = "A";// 错误写法
6
7
8 char c = A; // 错误写法
9
10 char c = 65;//正确写法
11
12 printf("%c\n", c);
13