位与字节:
位是计算机存储数据的最小单位。一个二进制位可以表示两种状态(0和1),多个二进制位组合起来便可表示多种信息。
一个字节由8位二进制数组成,有的计算机系统由16位组成。
定义一个基本整型数据,在内存中占4个字节,32位;定义一个字符型,在内存中占1个字节,8位。
不同数据类型占用字节数不同,二进制位数不同。
位运算操作符:
运算符:& 含义:按位与
运算符:| 含义:按位或
运算符:~ 含义:取反
运算符:^ 含义:按位异或
运算符:<< 含义:左移
运算符:>> 含义:右移
1、“与”运算符:
与运算符"&"是双目运算符,功能是使参与运算的两个数各对应的二进位相"与”。只有两个二进位均为1时,结果才为1,否则为0。
习题:利用与运算符将任意两个人的年龄进行与运算。代码如下:
2、“或”运算符:
或运算符“|”时双目运算符,功能时使参与运算的两个数各对应的二进位相“或”,只要对应的两个二进位有一个为1,结果就为1。
3、“取反”运算符:
“取反”运算符“~”为单目运算符,具有右结合性。其功能是对参与运算的数的各二进位按位求反,即将0变成1,或将1变成0。
注意:取反运算不是取其的相反数。
4、“异或”运算符:
异或运算符“^”是双目运算符,其功能是使参与运算的两个数各对应的二进位相“异或”,当对应的两个二进位数相异时结果为1,否则位0。
5、“左移”运算符:
“左移”运算符“<<”是双目运算符。其功能是把“<<”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。
说明:在移出位不含1的情况,左移一位相当于该数乘2,左移两位相当于乘4。
6、“右移”运算符:
右移运算符“>>”是双目运算符。其功能是把“>>”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。
习题:在程序上利用取反运算符将自己的年龄进行取反运算。代码如下:
循环移位:
循环移位是将移出的低位放到该数的高位或者将移出的高位放到该数的低位。
首先将x的左端n位先放到z中的低n位中:z=x>>(32-n);
然后将x左移n位,将其右面低n位补0:y=x<<n;
最后将y与z进行按位“或”运算:y=y|z;
循环右移:
首先将x的右端n位先放到z中的高n位中:z=x<<(32-n);
然后将x右移n位,将其左端高n位补0:y=x>>n;
最后将y与z进行按位或运算:y=y|z。
位段:
位段类型是一种特殊的结构类型,其所有成员的长度均是以二进制位为单位定义的,结构中的成员被称为位段。
位段定义的形式为;
{
类型 变量名1:长度;
类型 变量名2:长度;
.....
类型 变量名n:长度;
}
内存组织方式:
程序编写完毕,程序要先装载到计算机的内核或者半导体内存中,在运行程序。
分为4个逻辑段:
可执行代码
静态数据
动态数据(堆)
栈
堆:
堆用来存放动态分配内存空间。在内存的全局存储空间中,用于程序动态分配和释放的内存块称为自由存储空间。
在C语言中,使用malloc()函数和free()函数来从堆中动态地分配内存和释放内存。
栈:
栈是一个后进先出的压入弹出式的数据结构。
又形如:玻璃杯装小球
动态管理:
malloc()函数:
void *malloc(unsigned int size);
作用:在内存中动态地分配一块size大小的内存空间。
注意:使用malloc()函数分配的内存空间是在堆中,使用完这块内存要将其用free()函数释放掉。
习题:某明星的演唱会,会馆可以容纳一万人,请编写程序,申请内存能够将人数输出。代码如下:
calloc()函数:
void *calloc(unsigned n,unsigned size);
功能是在内存中动态分配n个长度为size的连续内存空间数组。
习题:利用calloc()函数申请内存,输出learning。代码如下:
realloc()函数:
void *realloc(void *ptr,size_t size);
功能:改变ptr指针指向的空间大小为size大小。
习题:定义一个整形指针和一个实型指针,然后利用realloc()函数重新分配内存。代码如下:
free()函数:
void free(void *ptr);
功能:释放由指针ptr指向的内存区,使部分内存区能被其他变量使用。