黑马程序员技术交流社区

标题: C基础笔记-进制 [打印本页]

作者: 长厢厮守℡    时间: 2015-12-6 15:18
标题: C基础笔记-进制
一.计算机中的进制
int a =18      计算机中默认是十进制数
二进制数:   以0b 或0B开头的数     int b = 0b10010
八进制数:   以0开头的数     int o = 022
十六进制数:   以0x或0X开头的数   int x = 0x12

格式输出符
十进制:%d   八进制:%o %D
十六进制: %x(a-f小写)  %X(A-F大写)
在C语言中没有提供二进制的输出格式符

二.进制转换
1. 十进制转二进制: 除2取余倒序排
  二进制转十进制: 每一位乘以对应位上的幂数然后相加
   (从右向左,从0开始数,到第几位就乘以2的几次方然后相加)
       0b10010    1*2(4)+1*2(1)=18
     1024   512  256   128  64  32  16  8  4  2  1
2. 二进制转八进制:一个八进制就对应3个二进制,1个八进制最大表示7,3个二进制最大表示7
      0b1,101 = 015
  八进制转二进制:一个八进制位转换为3个二进制位
      01,2,2 = 0b1010010
2. 二进制转16进制:一个十六进位对应4个二进制位,4个二进制数最大表示 15,一个十六进制位最大表示15
      0b1111 = 8+4+2+1=0x15
      0b1,0001,0010=ox112
  16进制转二进制:一个十六进位对应4个二进制位
      0xabc =  0b101010111100
3. 八进制转16进制== 八进制转换为二进制 → 二进制转换为十六进制
4. 十进制转十六进制:除以16取余倒序排
      100  =  0x64
  十六进制转十进制:每一位乘以对应位上的幂数然后相加
     0x64 =  6*16(1) +4*16(0) =100
5. 十六进制转八进制== 十六进制转二进制  →二进制转八进制
6. 十进制转八进制:除以8取余倒序排
    60/8    7  4
    7/8     0  7
     60= 074
  八进制转十进制:每一位乘以对应位上的幂数然后相加
    074 = 7*8(1)+4*8(0)=60

三.位运算符
1. & 按位与   对应的二进制位上,一个为0就是0,全1才是1
             一假则假        
2. | 按位或   对应的二进制位上,一个为1就是1,全0才是0
                  一真则真        
3. ^ 按位异或  对应的二进制位上,不同为1,相同为0

规律:(1) 多个数相互异或,交换顺序结果不变(类似加法交换律)
      (2) 任何数异或0都是原来的数
      (3) 相同的数相互异或,结果为0
4. ~ 按位取反  对应的二进制位   0变1  1变0 
  负数= 正数取反+1    正数取反=负数-1   
5. >> 右移  m>>n  向右移动n位 
移出来的数删掉,移入位补符号位  (正数补0,负数补1)
使用场景:快速计算一个整数除以2的n次方,对于一个整数来说右移几次就是除以几次方
6. << 左移  m<<n  向左移动n位
移出来的数删掉,移入位补0    左移可能会改变符号位(正负性)
使用场景:当数比较小的时候,可以快速的计算这个数乘以2多少次方

四.变量的存储细节
计算机中最小的存储单元是字节,%p用来输出地址。
在函数内部定义的变量称为局部变量,系统在栈中为其开辟存储空间

自己的理解
1.当定义变量的时候,系统首先会分配大地址,所以先定义的变量的地址大于后定义的变量地址
2.变量的地址就是其所在存储空间的最小的地址
3.高位在高字节,地位在低字节

五.变量修饰符(针对64操作系统)
1. 修饰长度
  int      4字节  
  short  2字节  %hd
  long   8字节  %ld
  long long 8字节 %lld
  所有数据都是用来修饰int的 所以int可以省略
2.修饰符号
  signed (所有数默认有符号,所以这个是废物)
  unsigned   无符号的数   %u
  只表示整数,不能表示负数,最高位不是符号而是数据位
unsigned    int               4字节  %u
                 short            2字节  %hd    %hu
                 long              8字节  %ld    %lu
                 long long        8字节  %lld   %llu


3.字符类型
1.字符  char  1字节
字符类型的本质是整形数
(1)当我们把一个字符复制给一个字符变量的时候,它首先去查ASCII码表,然后把值放到字符变量中
(2)当我们把一个字符按照%c格式输出的时候,它首先会去查ASCII码表,然后把对应的字符显示在控制台上,当我们表示一个较小的正整数,可以使用char 这样可以节省内存

六.代码练习
#include <stdio.h>
写一个函数以二进制形式打印十进制的数
void printBinary(int num)
{ // 计算变量num所在二进制位
     int length = sizeof(num)*8
  // 遍历二进制位
     for(int i=0;i<length;i++){
        int a = (num>>(length-1-i))&1;
        printf("%d",a);
      }
     printf("\n");
}
int main(int argc, const char *argv[]{
/*  10
     0000 0000 0000 0000 0000 0000 0000 1010
     0000 0000 0000 0000 0000 0000 0000 0001 &
  */
     printBinary(10);
   
   return 0;
}






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2