C语言——内存分析

 

内存分析主要包括以下几部分内容:进制、类型说明符、位运算和关于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 027 }

  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     

 

posted @ 2015-03-22 19:46  某个人  阅读(288)  评论(0编辑  收藏  举报