进制转换部分学习笔记

1、进制转换
a、十进制转二进制
计算机(物理特性决定的)只能识别二进制
求余法:麻烦但准确率高
求权法:速度快,减法运算准确率要高还要记得每个二进制位上的1所代表的十进制整数

    b、二进制转八进制
        八进制为了存储记录二进制的
        11111111 <=> 0377 
        每三个二进制位对应一个八进制,最后两位对应一个。
        注意:以0开头的数据表示八进制数据

    c、二进制转换十六进制
        随着计算机的发展,CPU的位数越来越大,八进制不能满足需要,因此我们使用十六进制。
        11111111 <=> 0xff
        每四个二进制位对应一个十六进制位,大于9的数用字母表示(10:a 11:b 12:c 13:d 14:e 15:f不区分大小写)
        注意:以0x开头的数据表示十六进制数据
2、数据在内存中的存储
    CPU只能计算加法,所有的计算都通过加法模拟实现的,因此所有的数据需要存储成补码形式才能进制模拟。
    注意:数据在内存中是以补码形式存储的。

    原码:由十进制转换出的二进制就叫原码
    反码:原码按位求反
    补码:
        正数的原码就是补码
        负数的反码+1才是补码
    
    -123 -> 01111011 -> 10000100+1 -> 10000101
    注意:补码转换成十进制的过程。
        1、必须要知道补码所表示的数据是否有符号
        2、如果是有符号补码,根据符号位判断是正数(最高位是0)还是负数(最高位是1)。
        
        10000101-1 -> 10000100 -> 01111011 -> -123
3、位运算符
    注意:位运算符是针对补码的运算。
    &   补码接位与运算
        11001100
        10110011
        --------
        10000000
    |   补码接位与运算
        11001100
        10110011
        --------
        11111111
    ^   补码接位异或运算
        11001100
        10110011
        --------
        01111111
    ~   补码按位求反运算
        ~11001100
         00110011
        
        00000001
        11111110
    << 左移
        x << n 把x的补码左移n位,左边的丢弃,右边补0。
        11111110 << 3 -> 11110000
        11110000 -> 11101111 -> 00010000 -> -16
        128+64+32+16 = 240
    >> 右移
        x >> n 把x的补码右移n位,右边的丢弃,左边补符号位。
        11111110 >> 3 11111111
        01001100 >> 4 00000100
4、数组
    数组:变量的组合,是一种批量定义变量的方式。

    一维数组:把变量排成一排。
    定义:类型 数组名[数量];
        int arr[5] <=> int n1,n2,n3,n4,n5;
    初始化:与普通变量一样,默认值不确定,为了安全要进行初始化。
        类型 数组名[数量] = {v1,v2,v3,...};
        1、初始化数据过多,丢弃多余的数据,并产生警告。
        2、始化数据不够则补0,如:int arr[5] = {}。
        3、可以省略数组的数量,编译器会统计初始化数据的个数然后告诉数组。
            sizeof(arr)/sizeof(arr[0]) 计算数组的长度
    使用:数组名[编号]
        编译从零开始,范围:0~数量-1。
        注意:[]括号中的整数,在定义时表示数量,在使用时表示编号。
    遍历:与for循环配合,循环变量当作数组的编号。
        int arr[5];
        for(int i=0; i<5; i++)
        {
            printf("%d ",arr[i]);
        }

    二维数组:把变量排成方阵
    定义:类型 数组名[行数][列数];
        int arr[3][5];
        [][][][][]
        [][][][][]
        [][][][][]
    初始化:类型 数组名[行数][列数] = {
            {v1,v2,v3,...},
            {v1,v2,v3,...},
            {v1,v2,v3,...}};
    使用:数组名[行编号][列编号];
    遍历:与双层for循环配合,外循环遍历行,内层循环遍历列。
        int arr[3][5];
        for(int i=0; i<3; i++)
        {
            for(int j=0; j<5; j++)
            {
                printf("%d ",arr[i][j]);
            }
            printf("\n");
        }
    变长数组:指的是数组的长度在编译时可以不确定,在运行期间决定它长度的变量可以根据实际发生变化,但当执行到数组定义语句时,数组的长度就确定下来了不能再变。
        也就是确定数组长度的时间由编译时到执行定义语句时。
        int n;
        scanf("%d",&);
        int arr[n];
    优点:可以根据实际情况来确定数组的长度,达到节约内存的目的。
    缺点:不能初始化(数组的初始化是由编译器帮助完成的,而编译时变长数组的数量还不确定,因此不能初始化)。

    数组的越界问题:
        编译器为了执行效率,不会检查数组的下标是否越界,(因此数组的越界从语法解译来说是合法的)。
        在使用数组时超出它定义时的范围就叫越界(下标>=数量)。
        数组越界的后果:一切正常、段错误、脏数据。
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值