整理今天的学习内容
1.memmove使用和模拟实现
void* memmove (void* destination,const void* source,size_t num);
和momcpy的差别是memmove函数处理的源内存块和目标内存块是可以重叠的
memmove的模拟实现:
2.memset函数的使用
void* memset (void* ptr, int value, size_t num);
memset是用来设置内存的,将内存中的值以字节为单位设置成想要的内容
3.memcmp函数的使用
int memcmp(const void* ptr1, const void* ptr2, size_t num);
分别从ptr1和ptr2指向的位置开始向后比较num个字节
数据在内存中的储存
1.大小端字节序和字节序判断
超过⼀个字节的数据在内存中存储的时候,会遇到存储顺序的问题
储存顺序有两种:
大端(存储)模式:
数据的低位字节内容保存在内存的高地址处,而数据的高位字节内容保存在内存的低地址处
小端(存储)模式:
数据的低位字节内容保存在内存的低地址处,而数据的高位字节内容保存在内存的高地址处
2.练习题
(1)设计一个小程序来判断当前机器的字节序
(2)解释程序运行的结果
128:原码:00000000 00000000 00000000 10000000
反码:01111111 11111111 11111111 01111111
补码:01111111 11111111 11111111 10000000
a:10000000
整型提升:11111111 11111111 11111111 10000000
打印的是无符号整数11111111 11111111 11111111 1000000+0
(3)解释程序运行的结果
将-1~-1000赋给char类型的变量
a
00000000 0
00000001 1
00000010 2
00000011 3
......
01111111 127
10000000 -->11111111 11111111 11111111 10000000-->10000000 00000000 00000000 01111111-->10000000 00000000 00000000 10000000 -128
10000001 -127
......
11111111 -1
所以从-1一直赋下去直到a中存的是0,最终结果是255
(4)
解释程序运行的结果
当-1存入i时,补码为11111111 11111111 11111111 11111111,因为i是无符号整型,所以i被打印出来是一个很大的数,继续减1一直循环
(5)该代码运行环境是x86,小端字节序
解释程序运行的结果
ptr1略,a是数组首元素地址,这个数组在内存中的存放为:01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 被强制转换为int类型,地址数值+1,再强转为int*类型,此时ptr2是00 00 00 02 的地址,用十六进制打印出来就是2000000