黑马程序员—C语言笔记—内存剖析

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

、进制

1、定义:是一种计数的方式,数值的表示形式。

2、常用的4种进制:

二进制0b/0B开头 int num1 = 0b1100

八进制0开头 int num2 = 014

十进制int num3 = 12

十六进制0x/0X开头 int num4=0xc

3、输出格式符

4、进制的转换

a、二进制转十进制      0b1100=1*23次方+1*22次方+0*21次方+0*20次方=12

b、十进制转二进制      56=32+16+8=25次方+24次方+23次方=0b111000

5n位二进制的取值范围:0 ~ 2n次方-1

二、变量的内存分析

1、内存是由大到小寻址,只存储二进制形式。

a、数值在内存中的存储:例:120000 0000 0000 0000 0000 0000 0000 1100

b、负值在内存中的存储:例:-121111 1111 1111 1111 1111 1111 1111 0100

c、最前位是符号位,是0则为正数,是1则为负数。

d、负数的存储涉及到了原码、反码、补码。

2、基本数据类型的取值范围:


3、例:

int main() 

{

    // 一个int类型数据占据4个字节、32bit

    // 0000 0000 0000 0000 0000 0000 0000 1100

    int number = 12; // 1100

    

    // 0000 0000 0000 0000 0000 0000 0000 1101

    int number2 = 13; // 1101

    

    return 0;

}


三、类型说明符

1short          2个字节         %d输出

short == short intshort a = 1short int a = 1;是相同的;

2long           8个字节(扩充整型数据,扩充为8个字节)             %ld输出

long == long int;一般有l来修饰说明是long类型;long int a = 12345678901234l

3、longlong 8个字节            %lld输出

long long == long long int;一般有ll来修饰说明是long long 类型;long long int a =  12345678901234ll

4、signed代表有符号              最高位是符号位              -231次方~ 231次方-1            %d输出;

5unsigned代表无符号          最高位不是符号位          0 ~ 232次方-1                             %u输出;

      signedunsigned都是4个字节,signedint是一样的,unsigned的最高位不要当做符号位。

long unsigned int a = 23894234

四、位运算 

1&按位与:只有对应的两个二进位均为1时,结果位才为1,否则为0

12&5结果是4

1100

0101   =>01004的二进制。

作用:可以精确的获取某一个精确位;

使用位与&运算符变量的奇偶性:

a&1 == 1; //a为奇数

a&1 == 0; //a为偶数

2|按位或:只要对应的二个二进位有一个为1时,结果位就为1,否则为0

16|5结果是13

1100

0101   =>110113的二进制。

3^按位异或:当对应的二进位相异(不相同)时,结果为1,否则为0

12^5结果是9

1100

0101   =>10019的二进制。

规律:

  1. 相同整数相^的结果是05^5==0
  2. 多个整数相^的结果跟顺序无关;5^6^7==5^7^6
  3. 任何数值和0进行^,结果还是原来的数值;5^0==5
  4. a^b^a==b;

例:不引入其他变量的情况下,使用异或^运算符实现两个变量值的互换:

#include <stdio.h>

int main()

{

         int a =10,b=12;

          a=a^b; 

          b=a^b;

          a=a^b;

          printf(“a=%d,b=%d\n”,a,b)

          return 0;

                  }

4~按位取反

~0000 0000 0000 0000 0000 0000 0000 1001

1111 1111 1111 1111 1111 1111 1111 0110

printf(“%d\n”,~9);输出的是-10

5<<左移

a << n => a * 2n次方;

a、把整数a的各二进位全部左移n位,高位丢弃,低位补0。左移n位其实就是乘以2n次方;b、由于左移是丢弃最高位,0补最低位,所以符号位也会被丢弃。

b、左移出来的结果值可能会改变正负性;

6>>右移

a >> n => a /2n次方;

a、把整数a的各二进位全部右移n位,保持符号位不变。右移n位其实就是除以2n次方。

b、为正数时, 符号位为0,最高位补0;为负数时,符号位为1,最高位补1。

7、例:编写一个函数,用来输出整数在内存中的二进制形式:

void printBinary(int number)

{

    //记录现在挪到第几位

    int temp = (sizeof(number)<<3) - 1;//相当于sizeof(number) * 8 - 1

    while (temp >= 0) {

         // 先挪位,再&1,取出对应位的值

        int value = (number >> temp) & 1;

        printf(“%d",value);

        // 每输出4位,就输出一个空格

        if( temp % 4 == 0)

        {

            printf(" ");

        }

        temp--;

    }

    printf("\n");

}

五、char类型

1、字符的存储是参照ASCII码表转成数值然后将二进制存入内存;

a、char c= ‘A’ 存在内存中是占1个字节 存入的形式是0100 0001;

b、大写字母与小写字母差值固定32’A’65’a’97

2int num=6;存入内存为6的二进制:0000 0000 0000 0000 0000 0000 0000 0110

      char a = ‘6’存入内存为’6’ASCII码值:是54的二进制:00110110

3、注意

a、单引号只能括住单字节的字符。

b、错误的写法:char c = A;char c = "A";char c = 'ABCD';char c = '';

c、正确的写法:char c= ‘A’; char c = 65;

d、例:

             #include <stdio.h>

int main()

{

char c = ‘A’;

switch(c)

{

case ‘A’ : printf(“1\n”);break;

case ‘B’ : printf(“2\n”);break;

//case 65 : printf(“3\n”);break;//这个和case ‘A’是重复的,都写会报错

default: printf(“4\n”);break;

}

return 0;

}

4、当做整型使用:在-128~127范围内,可以当做整数来用

5、转义字符 \

             \n回车换行10

\tTAB 9

\\一个反斜线字符92

\'一个单引号字符39

\”一个双引号字符34

\0空字符0 

6、实例:小写转大写

#include <stdio.h>

int main()

{

char upper(char);

char c = upper(‘A’);

printf(“%c\n”,c);

return 0;

             }

char upper(char c)

{

if(c >= ‘a’ && c<=’z’)

{

return c – (‘a’ - ‘A’);

}

return c;

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值