zoukankan      html  css  js  c++  java
  • 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
    ", 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
    ", c);
    23     
    24     int s = sizeof(long long int);
    25     printf("%d
    ", 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
    ", c);
    13     
  • 相关阅读:
    xml方式将dataset导出excel
    linux安装Navicat,界面出现乱码解决方法 (转发)
    ERROR 29 (HY000): File '/var/lib/mysql/txtdata/yz2014_1.txt' not found (Errcode: 13 "Permission denied")
    centos7中yum安装ntfs3g(转载)
    MariaDB中my.cnf文件误删除
    Mysql操作命令出现错误时消除/mysql数据导入txt
    Linux查找yum安装软件在系统中路径
    Centos7安装MariaDB安装数据库yum安装数据库远程登录数据库存储路径更改
    Zookeeper常用命令
    Hbase学习连接-数据导入
  • 原文地址:https://www.cnblogs.com/gaizuojia/p/4356413.html
Copyright © 2011-2022 走看看