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

---------------------- <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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值