C语言基础—内存剖析

------ android培训java培训、期待与您交流! ----------

进制:

进制就是一种计数的方式。

进制一般分为:十进制、二进制、十六进制、八进制

看看用代码怎么表示这些进制:
int main()
{
    int number1 = 12; // 十进制
    int number2 = 0b1100; // 二进制1100
    int number3 = 014; // 八进制14
    int number4 = 0xc; // 十六 进制c
    printf("%d-%d-%d-%d", number1, number2, number3, number4);
    return 0;
}
1. 默认情况下,就是十进制
2. 0b开头,就是二进制
3. 0开头,就是八进制
4. 0x开头,就是十六进制

占位符类型:
%d:以十进制输出一个整数
%o:以不带符号的八进制输出整数
%x:不带符号的十六进制输出整数
%u:不带符号的十进制输出整数
%c:输出一个字符
%s:输出一个或多个字符
%f: 一小数形式,双进度,默认输出六位小数
%e:以标准数输出
%p:输出整数

int number = 12;
一个int类型数据占据4个字节,32bit
0000  0000  0000  0000  0000  0000  0000 1100

注意点:
.089----->0.089
96f------->这是错的,f前面只能加小数
15.4e6------>15.4*10的6次方

二进制转十进制:
1100------->2*2的3次方+2*2的2次方+0*2的1次方+0*2的0次方 = 12

十进制转二进制:
12 = 8 + 4 = 2*2的3次方 + 2*2的2次方 = 0b1100

n为二进制的取值范围------>0~2的n次方-1,n为二进制的位数。

二进制的正负数:
最高位为0,则为正
最高位为1,则为负

int类型的取值范围:-2的31次方-1 ~ 2的31次方-1
char类型的取值范围: -2的7次方-1 ~ 2的7次方-1

类型说明符:

如果一个数超出了int的取值范围,这个时候就要使用类型说明符来修改int的取值范围

int的类型说明符有4种:
1. short:将int缩为两个字节
2. long:将int扩充为8个字节,输出用%ld
3. signed:有符号包含正数,0,负数
3. unsigned:无符号,0,正数,用%u输出,无符号为取值范围0 ~ 2的32次方 -1

位运算:

位运算分为6种:&按位与、|按位或、^按位异或、~按位取反、<<左移、>>右移

1. &按位与:
9&5 ------->1001&0101--------->0001
只要对应的二进制的位数都为1时,结果为1,否则为0。
功能:可以精确的知道二进制位

2. |按位或
9|5 ------->1001|0101--------->1101
只要对应的二进制的位数有1,则为1,否则为0。

3. ^按位异或
9^5 ------->1001^0101--------->1100
只要对应的二进制的位数不同,则为1,否则为0。
功能:
1. 相同整数^异或,结果为0。
2. 9^5^6 == 5^6^9。
3. 与0^为自身。
4. a^b^a == b。

4. ~按位取反
~9 --------->~1001 ----------->0110
把每一个二进制位取反(包括符号位)

5. <<左移
 a << n   
*把整数a的各个二进制位左移n位 ,左移n为其实就是*2的n次方
9 << 1 ---->18;
9 << 2 ---->32;
* 左移是丢弃最高位,0补最低位,结果可能改变正负性。

6. >>右移
a >> n
* 把整数a的各个二进制位位右移n位,右移n位其实就是/2的n次方
* 为正数时,丢弃最低位,0补最高位
   为负数时,符号位1,丢弃最低位,最高位取0取1看编译器特性。Xcode中是补0(64位编译器) 

位运算的应用:
1. ^按位异或交换两变量
int main()
{
    int a =1, b = 2;
    a = a^b;
    b = a^b;
    a = a^b;
    return 0;
}

2. &按位与判断奇偶性:
奇偶性的本质就是二级制最后一位的差别,若最后一位为1就是奇数,若为0就是偶数。
a&1,结果为1就是奇数,结果为0就是偶数

3. 输出整数在内存中二进制的存储形式
int main()
{
    int number = 9;
    int temp = (sizeof(number)<<3) - 1;
    while (temp > 0)
    {
        int value = number >> temp&1;
        printf("%d\n", value);
        temp --;
        if (temp%4 == 0)
        {
            printf(" ");
        }
    }
    return 0;
}

char类型存储:

char类型内存细节:char只占用一个字节。
char类型在内存中存储的时候也是用数字存储的(ASCII值)
A的ASCII值为65
a的ASCII值为97

注意点:
char类型存储只占一个字节,一个汉字需要3个字节,故char c = '男'这样写是错误的。
' ' 只能扩住单字节字符(ASCII表中的东西)

char类型都是可以是有int表示的。

------ android培训java培训、期待与您交流! ----------

你可能感兴趣的:(C基础)