04-C语言进制和位运算

2018-09-01  本文已影响0人  低头看云

进制基本概念

// 12的不同进制的表达
// 用十进制来表示
int num1 = 12;
printf("num1 = %i\n", num1);
// 用十六进制来表示
int num2 = = 0xc;
printf("num2 = %i\n", num2);
// 用八进制来表示
int num3 = 014;
printf("num3 = %i\n", num3);
// 用二进制来表示
int num4 = 0b1100;
printf("num4 = %i\n", num4);

// 不同进制的输出
int num = 12;
// 以十进制输出
printf("%i\n", num);
// 以八进制输出
printf("%o\n", num);
// 以十六进制输出
printf("%x\n", num);
//二进制

void printBinary(char value){
    
}

进制转换

十进制小数转换为二进制小数

// 整数部分(除2取余)
  12
/  2
------
   6    // 余0
/  2
------
   3    // 余0
/  2
------
   1   // 余1
/  2
------
  0   // 余1
//12 --> 1100
  
// 小数部分(乘2取整数积)
  0.125
*     2
  ------
   0.25  //0
   0.25
*     2
  ------
    0.5  //0
    0.5
*     2
  ------
    1.0  //1
    0.0
// 0.125 --> 0.001

// 12.8125 --> 1100.001


二进制转换为十进制小数

// 整数部分(乘以2的n次方, n从0开始)
0 * 2^0 = 0
0 * 2^1 = 0
1 * 2^2 = 4
1 * 2^3 = 8
 // 1100 == 8 + 4 + 0 + 0 == 12

// 小数部分(乘以2的负n次方, n从0开始)
0 * (1/2) = 0
0 * (1/4) = 0
1 * (1/8) = 0.125
// .100 == 0 + 0 + 0.125 == 0.125

// 1100.001  --> 12.125


0.8125
*      2
--------
   1.625  // 1
   0.625
*      2
--------
    1.25 // 1
    0.25
*      2
--------
     0.5 // 0
*      2
--------
    1.0 // 1
    0.0

// 0. 8125  --> 0.1101


原码 补码 反码之间的关系

     0000 0000 0000 0000 0000 0000 0000 1100
    // int num = 12; 
    
// int  num = -12; 
原码 : 二进制,将最高位变为1;
1000 0000 0000 0000 0000 0000 0000 1100

反码 : 除了符号位以外, 0变1, 1变0;
1000 0000 0000 0000 0000 0000 0000 1100  12的反码

补码 : 反码 + 1
    1111 1111 1111 1111 1111 1111 1111 0011  12的反码
  + 0000 0000 0000 0000 0000 0000 0000 0001   +1
    ----------------------------------------
    1111 1111 1111 1111 1111 1111 1111 0100  12的补码
    
    // 注意点: 无论是正整数还是负整数,存储在计算机中都是补码

// 1 - 1; 1 + (-1);
   0000 0000 0000 0000 0000 0000 0000 0001 // 1原码
  +1000 0000 0000 0000 0000 0000 0000 0001 // -1原码
   ---------------------------------------
   1000 0000 0000 0000 0000 0000 0000 0010 == -2


    
    
    /*
     * 1 - 1  理解为 1 + (-1)
     * 0000 0000 0000 0000 0000 0000 0000 0001    1补码就是原码
     *
     // 求-1的补码
     * 1000 0000 0000 0000 0000 0000 0000 0001    -1源码
     * 1111 1111 1111 1111 1111 1111 1111 1110    -1反码
     * 0000 0000 0000 0000 0000 0000 0000 0001
     * -----------------------------------------
     
     * 1111 1111 1111 1111 1111 1111 1111 1111    -1补码
     *
     *
     *   0000 0000 0000 0000 0000 0000 0000 0001     1补码
     * + 1111 1111 1111 1111 1111 1111 1111 1111    -1补码
     * -------------------------------------------
     *   0000 0000 0000 0000 0000 0000 0000 0000    0
     */


    /*
     * 4 - 6 --> 4 + (-6)
     * 0000 0000 0000 0000 0000 0000 0000 0100  4补码
     *
     * 1000 0000 0000 0000 0000 0000 0000 0110  -6源码
     * 1111 1111 1111 1111 1111 1111 1111 1001  -6反码
     * 0000 0000 0000 0000 0000 0000 0000 0001
     * -------------------------------------------
     * 1111 1111 1111 1111 1111 1111 1111 1010  -6补码
     *
     *
     *
     * 0000 0000 0000 0000 0000 0000 0000 0100  4补码
     * 1111 1111 1111 1111 1111 1111 1111 1010  -6补码
     * 1111 1111 1111 1111 1111 1111 1111 1110  补码的结果
     *
     * 注意点: 当前计算出来的是正确结果的补码, 要想知道正确结果是多少, 需要将补码转换为源码
     // 原码 = (补码 - 1)再求其反码
     *
     * 1111 1111 1111 1111 1111 1111 1111 1110  结果的补码
     * 0000 0000 0000 0000 0000 0000 0000 0001  减1
     * -------------------------------------------
     * 1111 1111 1111 1111 1111 1111 1111 1101  结果的反码
     * 1000 0000 0000 0000 0000 0000 0000 0010  结果的源码  -2
     */

    /*
         0101
       + 0001
         -----
         0102 --> 0110
    
         0110 --> 0102
       - 0001     0001
        ---------------
                  0101
   */

位运算符

符号 名称 运算结果
& 按位与 同1为1
| 按位或 有1为1
^ 按位异或 不同为1
~ 按位取反 0变1,1变0
<< 按位左移 乘以2的n次方
>> 按位右移 除以2的n次方

      9 << 1
      0000 0000 0000 0000 0000 0000 0000 0000 // 位置参考
      000 0000 0000 0000 0000 0000 0000 10010 // 9的补码
/*
    // 9 >> 1
     0000 0000 0000 0000 0000 0000 0000 0000 // 位置参考
     00000 0000 0000 0000 0000 0000 0000 100  --> 4
     */
    printf("%i\n", 9 >> 1);
    
    
    //  -9 >> 1
    
    /*
     * 1000 0000 0000 0000 0000 0000 0000 1001 // -9源码
     * 1111 1111 1111 1111 1111 1111 1111 0110 // -9反码
     * 1111 1111 1111 1111 1111 1111 1111 0111 // -9补码
     *
     0000 0000 0000 0000 0000 0000 0000 0000 // 位置参考
     11111 1111 1111 1111 1111 1111 1111 011 // 右移完毕的结果, 补码
     0000 0000 0000 0000 0000 0000 0000 0001
     11111 1111 1111 1111 1111 1111 1111 010 // 右移完毕的结果, 反码
     10000 0000 0000 0000 0000 0000 0000 101 // 右移完毕的结果, 源码
     */
    printf("%i\n", -9 >> 1);

变量的内存分析

image

char类型内存存储细节

int num1 = 10;
int num2 = 20;
printf("num1 = %p\n", &num1);
printf("num2 = %i\n", &num2);
字符 意义
\b 退格(BS)当前位置向后回退一个字符
\r 回车(CR),将当前位置移至本行开头
\n 换行(LF),将当前位置移至下一行开头
\t 水平制表(HT),跳到下一个TAB 位置
\0 用于表示字符串的结束标记
\ 代表一个反斜线字符 \
" 代表一个双引号字符 "
' 代表一个单引号字符 '

类型说明符

上一篇下一篇

猜你喜欢

热点阅读