学习C语言(19)

整理今天的学习内容

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值