C/C++メモ(一)2015/8/15

9241 ワード

1.C言語における左値と右値の違い
             ,            。
  ,             
  ,       ,         (   ),a+1,&a,       。

2.デバッグ、ブレークダウン
  :        ,      

GPU,      

3.constとdefineの違い
const       , define  ,     
#define K 100.0
const int Knum = 100.0; //              

void  main()
{
    printf("%d
"
, K); printf("%d", Knum); }

4.printfのフォールトトレランスメカニズム
printf     ,     ,         ,  printf         
`printf("%d, %d
", 10.9, 10);` , , 10 //printf %d,%u,
    unsigned int data1 = -1;    //    

    printf("%u
"
, data1); //%dprintf("%d
"
, data1); //%u

5.変数の付与値はコピーバイナリであり、メモリ間で直接コピーすることはできない.CPUを通過しなければならない
       ,const              。

6.ポインタの本質
         ,       (  ),             
void main8()
{   //         ,       (  ),             
    int num = 100;
    double *p1 = #  //     num      p1, num         
    int *p2 = #
    float *p3 = #

    printf("%f
"
, *p1); // printf("%d
"
, *p2); // printf("%f
"
, *p3); // , 0.00000 getchar(); }

携帯番号使用long long intメモリ数
7.floatストレージ
      (  )    

        ,   s,  e,  x
1. 31 bit    , 0    , 1    (32-bit    ,64-bit       );
2. 30~23bit, 8bit   ,     e  , 2  ;
3. 22~0bit, 23bit    ,        ,           x;

浮動小数点数の値を10進数で(-1)^s*(1+x)*2^(e-127)と表す
シンボルビットのコード推論
float fl1 = 10.0;
float fl2 = -10.0;
printf("%p, %p
"
, &fl1, &fl2);

10.0の16進法41200000バイナリ0 100 0001 0 010 0000 0000 0000 0000 0000-10.0の16進法c 1200000バイナリ1 100 0001 0 010 0000 0000 0000 0000結論32番目のbitはシンボルビット
係数のコード推論
    float fl1 = 10.0;
    float fl2 = 11.0;
    float fl3 = 5.0;

    printf("%p, %p, %p
"
, &fl1, &fl2, &fl3);
10.0     41200000      0  100 0001 0  010 0000 0000 0000 0000 0000
11.0     41300000      0  100 0001 0  011 0000 0000 0000 0000 0000

10      100 0001 0              
1010    +130(130-127)        1.010*2^3

11      100 0001 0              
1011    +130(130-127)        1.011*2^3

べき乗数のコード推論
    float fl1 = 1.0;
    float fl2 = 2.0;
    float fl3 = 0.5;

    printf("
%p,%p,%p"
, &fl1, &fl2, &fl3);
1.0     3f800000      0  011 1111 1  000 0000 0000 0000 0000 0000
2.0     40000000      0  100 0000 0  000 0000 0000 0000 0000 0000
0.5     3f000000      0  011 1111 0  000 0000 0000 0000 0000 0000

1.0      011 1111 1              
0000        127         1.000*2^0

2.0       100 0001 0              
0000        128         1.000*2^1

0.5       100 1111 0              
0000        126(e-127)         1.000*2^(-1)

8.なぜ補数を使うのか
           

         1 ,-3   
    1   : 0000 0001
    -3   :1000 0011

       ,     ,    ,      
                      0000 0010
                  1000 0010, -2
    
    1   :   0000 0001
    -3   :   1111 1101
           1111 1110 
    1111 1110     1000 0010    -2
    3 -1  
    3   :   0000 0011
    -1   :   1111 1111
          10000 0010 
      1  ,  0000 0010
    0000 0010      0000 0010    2
                     ,          

9.ビット演算
    &   0&0->0  0&1->0  1&0->0  1&1->1
    |   0|0->0  0|1->1  1|0->1  1|1->1
   ^   0^0->0  0^1->1  1^0->1  1^1->0        0,    1
            ,       

    unsigned char ch1 = 15; //0000 1111
    unsigned char ch2 = 255;//1111 1111

    ch1 = ch1^ch2;  //ch1 = 1111 0000  ch2 = 1111 1111  
    ch2 = ch2^ch1;  //ch2 = 0000 1111  ch1 = 1111 0000
    ch1 = ch1^ch2;  //ch1 = 1111 1111  ch2 = 1111 0000

    ~   ~0 = 1     ~1 = 0
    !0 = 1            

unsigned char ch1 = ~0;   ~0    1111 1111
unsigned int int1 = ~0;   ~0    1111 1111 1111 1111 1111 1111 1111 1111

   <<   0001<<1 -->0010       0001<<2 -->0100 //       2
        int num = 1;
        printf("%d
", num << 1); // 2, num printf("%d
", num << 2); // 4, num printf("%d
", num); // 1 printf("%d
", num <<= 2); // 4,num <<= += printf("%d
", num); // 4 >> 0100>>1 -->0010 0100>>2 -->0001 // 2

と:指定した文字をゼロにするか、指定した文字を異にするか、指定した文字を反転します.
10.1つの数のバイナリの中の1の個数を求めます
       
      100         1100100     3 1
    100-1=99        1100011
    100&99=96       1100000         1   +1
    96-1=95         1011111
    96&95=64        1000000         1   +1
    64-1=63         0111111
    64&63=0         0000000         1   +1

        
    for (; num; num = num&(num-1))
        wei++;
      
    int getwei3(int num)
    {
        if (num == 0)
            return 0;
        else
            return 1 + getwei3(num&(num - 1));
    }

11.一つの数の補数と元のコードを求める
ほじょふごう
                    
  1     0000 0000 0000 0000 0000 0000 0000 0001
   -1     1111 1111 1111 1111 1111 1111 1111 1111
        1000 0000 0000 0000 0000 0000 0000 0000
         1  -1                  ,    1  -1    ,         ,    
    int num = 1;
    int data = 1 << 31;
    for (int i = 1; i <= 32; i++) {
        printf("%c", (data&num ? '1' : '0'));
        num <<= 1;
        if (i % 4 == 0)
            printf(" ");
    }
          
    void buma(int n, int cnt)
    {
        int data = 1 << 31;
        if(cnt == 0)
            return;
        if(cnt %4 == 0)
            printf(" ");
        printf("%c", (data&n ? '1' : '0'));
        n <<=1;
        --cnt;
        buma(n,cnt);
    }

もとのコードを求めます
            ,          ,              :
  ->  :     ,     +1
  ->  :     ,     +1

  num = -1;
    num = ~num +1;//        ,   ,         
    num = num | (1<<31);//           1
    //            

    :
    if (num < 0) {
        num = ~num + 1;//       
        num = num | data;
    }
    for (int i = 1; i <= 32; i++) {
        printf("%c", (data&num ? '1' : '0'));
        num <<= 1;
        if (i % 4 == 0)
            printf(" ");
    }

逆符号:
-1    1000 0001
       1111 1110
       1111 1111
                -1

  :
    if (num < 0) {
        num -=1;
    }
    for (int i = 1; i <= 32; i++) {
        printf("%c", (data&num ? '1' : '0'));
        num <<= 1;
        if (i % 4 == 0)
            printf(" ");
    }

符号を補って元の符号の正数の不変の負数を求めるならば逆+1を取って符号のビットをリセットして符号の正数の不変の負数を補って求めるならば-1