• C语言-05-内存分析


    一、进制

    1> 内存细节

    • 根据数据类型分配相应大小的内存空间
    • 内存空间由高地址向低地址分配
    • 数据一般按照从高位到低位存储

    2> 常用的进制格式

    1. 十进制

      ① 由0~9十个数字组成
      ② 逢10进1
      ③ 默认为十进制数
      ④ printf函数的输出格式为%d或%i
      ⑤ 内存中以二进制存储
      
    2. 二进制

      ① 由0和1两个数字组成
      ② 逢2进1
      ③ 在数字开头加上0b或0B,表示二进制数
      ④ 无法直接输出二进制数,需要进行转换
      
    3. 八进制

      ① 由0~7八个数字组成
      ② 逢8进1
      ③ 在数字开头加上0,表示八进制数
      ④ printf函数的输出格式为%o
      
    4. 十六进制

      ① 由0~9,a~f(A~F)十六个字符组成
      ② 逢16进1
      ③ 在数字开头加上0x或0X,表示十六进制数
      ④ printf函数的输出格式%x或%X
      

    3> 进制之间的转换

    1. 二进制与十进制

      ① 二进制转化为十进制,是二进制数各个数位上得数字乘以2的该数
        位所在的位数减1次幂,如:0b11 = 1x(2的1次幂)+ 1x(2
          的0次幂)
      ② 十进制转化为二进制,先将该数转化为2的幂次累加的形式,系
        数就为该十进制数的二进制形式,如11 = 1x(2的3次幂)+ 0x(2
        的2次幂)+1x(2的1次幂)+1x(2的0次幂)
      
    2. 二进制与八进制

      ① 二进制转化为八进制数,先将二进制数从低位到高位,每三位分为
        一组,每组转化为一位八进制数
      ② 八进制转化为二进制数,将八进制数一位转化为三位二进制
      
    3. 二进制与十六进制

      ① 二进制转化为十六进制,先将二进制数从低位到高位,每四位分为
        一组,每组转化为一位十六进制数
      
    4. 八进制、十六进制与十进制

      ① 八进制、十六进制与十进制之间的转化,一般要借助二进制,先
        将八进制、十六进制或十进制转化为二进制,再进行转化
      

    4> 类型说明符

    1. long和short

      ① short修饰的数据占两个字节,short默认表示short int类型,一
        般在进行操作之前,先转化为int类型,printf函数的输出格式为%d
      ② long修饰的数据占八个自己,long默认为long int类型,printf
        函数的输出格式为%ld
      
    2. signed 和unsigned

      ① unsigned修饰的数据只能表示整数非负整数
      ② signed修饰的数据可以表示整数,默认为signed类型
      ③ unsigned类型表示的非负整数个数时signed表示的二倍
      

    5> n位2进制数的取值范围

    1. signed修饰

      signed修饰的n为二进制数的表示范围为(0~(2的n次幂-1))
      
    2. unsigned修饰

      unsigned修饰的n为二进制数的表示范围为((-2的n次幂)~
      (2的n次幂-1))
      

    6> 示例

    #include <stdio.h>
    
    //定义一个函数将一个整数转化为二进制形式输出
    void intToBinary(int number);
    
    int main()
    {
        //short unsigned定义的数据能表示最大的整数
        //为2的16次幂-1即65535,此句会发出警告
        short unsigned a = 65536;
        
        //定义int型变量,并将二进制数13赋值给该变量
        int b = 0b1101;
        //定义int型变量,并将八进制数13赋值给该变量
        int c = 015;
        printf("b=%o
    ", c);
        //定义int型变量,并将十六进制数13赋值给该变量
        int d = 0xd;
        printf("b=%x
    ", c);
        
        //将一个整数转化为二进制形式输出
        intToBinary(c);
        
        return 0;
    }
    
    //定义一个函数将一个整数转化为二进制形式输出
    void intToBinary(int number)
    {
        //存储number在内存中所占的位数
        int count;
        //存储每位二进制的数值
        int bit;
        
        //计算number在内存中所占的位数
        count = sizeof(number)*8;
       
        for (int i = count; i > 0; )
        {
            i--;
            //通过右移和按位与运算计算number每个二进制位的数值
            bit = number>>i & 1;
            printf("%d", bit);
            
            //每输出四个二进制位,输出一个制表符
            if (0 == i % 4)
            {
                printf("	");
            }
        }
    }
    

    二、位运算

    1> 按位与(&)

    • 全1才为1,否则为0
    • 可以某个二进制位的值

    2> 按位或(|)

    • 全0才为0,否则为1

    3> 按位异或(~)

    • 相同为0,不同为1
    • 某个数异或自己为0,异或0为自己
    • 异或运算可以交换
    • 异或可以用于交换两个变量的值

    4> 按位取反(^)

    • 0变为1,1变为0
    • 按位取反连同符号位一块取反

    5> 左移(<<)

    • 低位补0,溢出位舍弃
    • 符号位可能会被舍弃,正负性可能会改变
    • 某个数左移n为等价于该数乘以2的n次幂
    • 左移的效率比乘法高

    6> 右移(>>)

    • 负数右移,高位补1,溢出位舍弃
    • 整数右移,高位补0,溢出位舍弃
    • 某个数右移n为等价于该数除以2的n次幂
    • 右移的效率比除法高

    7> 示例(该示例使用代码块)

    	{
            int a = 9;
            int b = 8;
            //记录移动的位数
            int n;
            //记录中间变量的值
            int temp;
            
            /*
             用按位与运算判断一个整数的奇偶性,
             比较运算符的左值和右值,如果是表达式,尽量用小括号括住
             */
            (a & 1) == 1 ? 
            printf("a为奇数
    "):printf("a为偶数
    ");
            
            //按位或
            temp = a | b;
            
            //用按位异或运算实现交换两个变量的值
            a = a ^ b;
            b = a ^ b;
            a = a ^ b;
            
            //按位取反
            temp = ~a;
            
            //用左移运算符实现乘以2的n次幂运算,这里乘以2的1次幂
            n = 1;
            temp = a << n;
            
            //用左移运算符实现除以2的n次幂运算,这里除以2的2次幂
            n = 2;
            temp = a >> n;
        }
    

    三、char类型

    1> 内存细节

    • 占用一个字节大小的内存
    • 在内存中以ASCII码(一个整数)形式存储

    2> 使用注意

    • char类型可以存储一定范围的整形数据(0~127)
    • char类型可以进行自动类型提升整型,可以像操作整形数据一样操作char型数据
    • 具有特殊含义的字符用printf函数输出时,要先转化为转义字符
    • 将整数转化为字符,一般用这个整数加上'0',即为这个整数的字符形式

    3> 示例

    #include <stdio.h>
    #include <stdlib.h>
    
    //定义一个函数,将一个字符转化为对应的大小写形式
    char upperOrLower(char c);
    
    int main()
    {
        //存储一个字符
        char c;
        //存储字符转换后的形式
        char temp;
        
        c = 'a';
        //将一个字符转化为对应的大小写形式
        temp = upperOrLower(c);
    }
    
    char upperOrLower(char c)
    {
        //若字符为小写形式,转换为大写形式
        if (c >= 'a' && c <= 'z')
        {
            printf("该字符的小写形式为:%c
    ", c - ('a' - 'A'));
            return c - ('a' - 'A');
        }
        //若字符为大写形式,转换为小写形式
        else if (c >= 'A' && c <= 'Z')
        {
            printf("该字符的小写形式为:%c
    ", c + ('a' - 'A'));
            return c + ('a' - 'A');
        }
        else
        {
            printf("输入有误,程序退出!
    ");
            exit(1);
        }
    }
    
  • 相关阅读:
    KMP的next[]数组
    [Gauss]HDOJ3976 Electric resistance
    [Gauss]POJ2065 SETI
    [Gauss]POJ2947 Widget Factory
    更好的 SQL 模式的 10 条规则
    BZOJ2460: [BeiJing2011]元素
    BZOJ2115: [Wc2011] Xor
    洛谷P3164 [CQOI2014]和谐矩阵
    POJ1222熄灯问题
    POJ1830开关问题
  • 原文地址:https://www.cnblogs.com/theDesertIslandOutOfTheWorld/p/4717687.html
Copyright © 2020-2023  润新知