内存分析主要包括以下几部分内容:进制、类型说明符、位运算和关于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 11 10101001 12 13 1001 14 0101 15 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 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