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);
    }
}
原文地址:https://www.cnblogs.com/theDesertIslandOutOfTheWorld/p/4717687.html