黑马程序员 《ios零基础教程》 -- 内存剖析 2014-3-26总结

来源:互联网 发布:ecshop源码视频教程 编辑:程序博客网 时间:2024/06/07 21:01

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Unity开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------


今天学习了内存剖析中。

一、内存剖析

1.类型说明符

#include <stdio.h>/* int 4个字节  %d short 2个字节  %d long  8个字节  %ld long long  8个字节  %lld signed   4个字节 unsiged  4个字节  无符号输出  %u  */int main(int argc, const char * argv[]){    /*        signed和unsigned的区别:        signed 最高位要当做符号位        unsigned 最高位不要当做符号位     */    //    signed == signed int//    signed 有符号:正数、0、负数    signed int a = 10;    signed a2 = 10;    //    unsigned int == unsigned;//    unsigned 无符号:0、正数    unsigned int b = 10;    unsigned b2 = 10;        long unsigned int c3 = 234123;    long unsigned c2 = 23345;        short unsigned int d = 12934;    short unsigned d2 = 3458023;        short signed int e = 346234;    short signed e2 = 3593;            // long == long int//    long int a = 194004574894379792343l;//    long a2 = 194004574894379792343l;        //long long int == long long    long long int c = 1940045748943ll;//    long long c2 = 1940045748943ll;        //short == short int//    short int d = 5454;//    short d2 = 43434;     printf("%lld\n",c);        int s = sizeof(short);    printf("%d\n",s);    return 0;}

2.按位与、按位或、按位异或、按位取反

#include <stdio.h>/* 一、按位与 &:只要对应的两个二进位均为1时,结果位才是1,否则为0  10110100 10100100 ----------- 10100100  1001 0101 ----- 0001  二、按位或 |:只要对应的二个二进位有一个为1时,结果就是1,否则为0  1001 0101 ----- 1101  三、按位异或^:当对应的二进制相异(不相同)时,结果为1,否则为0. 1.相同数值进行异或,结果肯定是0,比如9^9 = 0   1001   1001 --------   0000 2.交换9^5^6 == 9^6^5 3.任何值跟0进行异或,结果还是原来的数值,9^0 == 9   1001   0000  ------   1001 4.a^b^a == b   1001 0101 ----- 1100  四、按位取反 ~ ~0000 0000 0000 0000 0000 0000 0000 1001  1111 1111 1111 1111 1111 1111 1111 0110  */int main(int argc, const char * argv[]){    printf("%d\n",9&5);    printf("%d\n",9|5);    printf("%d\n",~9);    printf("%d\n",9^5);    return 0;}

3.左移、右移,及其用法

#include <stdio.h>/* 一、左移 <<  向左移动,符号位也消失,右边边空出的一位用0补充  0000 0000 0000 0000 0000 0000 0000 0000  00 0000 0000 0000 0000 0000 0000 100100   9<<1 -> 9 * 2的1次方 == 18 9<<2 -> 9 * 2的2次方 == 36 9<<n -> 9 * 2的n次方  以后要输入如 a * 2的n次方,直接将二进制左移n位,a<<n  右移 >>  向右移动,符号位不变,左边空出的一位用符号位补充   0000 0000 0000 0000 0000 0000 0000 0000   000000 0000 0000 0000 0000 0000 0000 10  8>>1 -> 8/2 == 4 8>>2 -> 8/2的2次方 ==2 8>>n -> 8/2的n次方  以后要输入如 a / 2的n次方,直接将二进制又移n位,a>>n */int main(int argc, const char * argv[]){    // insert code here...    printf("Hello, World!\n");    return 0;}

4.练习:

1>用位与&运算符判断变量的奇偶性


//用位与&运算符判断变量的奇偶性#include <stdio.h>int main(int argc, const char * argv[]){      int a = 15;        //方法一    if (a%2 == 1) {        printf("奇数\n",a%2);    }else{        printf("偶数\n",a%2);    }        //方法二    a%2?printf("奇数\n",a%2):printf("偶数\n",a%2);        //方法三    a%2==0?printf("偶数\n",a%2):printf("奇数\n",a%2);        //方法四    /*     15:1111     09:1001          14:1110     10:1010     *///    a&1 == 1 //奇数//    a&1 == 0 //偶数        a&1?printf("奇数\n",a%2):printf("偶数\n",a%2);    return 0;}



2>两个变量值的互换


//两个变量值的互换#include <stdio.h>int main(int argc, const char * argv[]){    int a = 10;    int b = 11;        // 方法一    int temp;    temp = a;    a = b;    b = temp;        //方法二    a = b - a;    b = b - a;    a = b + a;        //方法三        a = a ^ b; // a = 10^11    b = a ^ b; // b = 10^11^11 =10    a = a ^ b;        printf("a = %d , b = %d\n", a ,b);    return 0;}


3>输出二进制位


#include <stdio.h>    /*     0000 0000 0000 0000 0000 0000 0000 0000      0000 0000 0000 0000 0000 0000 0000 1111          */    void printBinary(int number);int main(int argc, const char * argv[]){    printBinary(9);    return 0;}void printBinary(int number){    //记录现在挪到第几位    //(sizeof(number)*8) - 1 == 31        int temp = (sizeof(number)<<3)-1;        while (temp>=0) {        int value = number>>temp & 1;        printf("%d",value);        temp--;                //每隔四个数字就空一格        if ((temp+1)%4==0) {            printf(" ");        }    }    printf("\n");}



4>编写一个函数,将小写字母转化为大写字母


#include <stdio.h>char upper(char c){    /*    //思路:如果是小写字母,准换为大写字母,如果是其他数值,返回它本身    方法一:    if (c>='a' && c<='z') {  //确定范围大小        return c - 32;       //在ASCII码表中,大小写字母相差32    }else{        return c;    }*/            //方法二:    if (c>='a' && c<='z') {        return c - 32;    }    return c;}int main(int argc, const char * argv[]){    char cc = upper('f');    printf("%c\n",cc);    return 0;}


5.内存存储细节-ASCII码表


#include <stdio.h>int main(int argc, const char * argv[]){    //ASCII码表中‘A’和‘a’之间的差距是32     //网上搜ASCII码表    //0000 0000 0000 0000 0000 0000 0000 1001    int a = 9;        //0100 0001    char c = 'A';        printf("%c\n",c);        printf("%d\n",'D');        char c2 = 'A' + 33;        printf("%c - %d\n",c2 ,c2);        /*     ASCII码值     A      65     B      66     C      67     */        //    int num = 6;        //54 = 32 + 16 + 4 + 2;    //0011 0110    char c3 = '6';        printf("%d - %d\n",num , c3);        return 0;}



6.char类型的使用注意事项

#include <stdio.h>int main(int argc, const char * argv[]){    //char 类型的错误写法    /*    一、单引号‘’只能括住单字节的字符    char c = '男';     */        /*     二、双引号“”不能括单字符     char c = "A";     */        /*     三、不能没有引号括住,     char c = A;     */    //    char c = 65;//    printf("%c\n",c);        /*    char c = 'A';        switch (c) {        case 'A':            printf("1\n");            break;                        //这里不明白,上面的case‘A’执行完成之后应该整个break退出,怎么还会错误//        case 65://            printf("2\n");//            break;        default:            printf("3\n");            break;    }     */        //转义字符的使用    printf("\te\n");    printf("\\\n");    printf("\'\n");    printf("\"\n");    return 0;}










---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Unity开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------


0 0