小明看了看嵌入式相关代码,发现了他的一个盲点……他需要学会“拆分”和“组装”一个“大空间”变量。

程序定义了两个函数,一个用于将32位无符号整数“拆分”为三个无符号8位整数,一个用于将三个无符号8位整数“组装”回32位无符号整数。在主函数内,使用者将输入一个32位无符号整数,程序将这个数转存到无符号8位整数数组中,并在打印数组后,调用“组装”函数将数组组装回32位无符号整数。

“拆分”示意图:

32位无符号整数:
- 十进制:258
- 二进制:0000 0000 0000 0001 0000 0010
被拆分为三个8位无符号整数:
- 第一个8位无符号整数:
  - 二进制:0000 0000
  - 十进制:0
- 第二个8位无符号整数:
  - 二进制:0000 0001
  - 十进制:1
- 第三个8位无符号整数:
  - 二进制:0000 0010
  - 十进制:2
8位无符号整数数组打印样式:
000,001,002

实现以下两个函数:

* @brief : 将 value 拆分为 3 段,写入 disk 中 * @param value: 待写入值 * @param disk : 被写入的位置 void serialization(uint32_t value, uint8_t *disk); * @brief : 将 data[0] ~ data[2] 组合为一个int变量 * @param data: 数据保存位置 * @return : 组合得到的值 uint32_t deserialize(const uint8_t *data);

程序运行时,通过scanf获取一个不大于0xffffffff的正整数。

被转存的数组,以及由数组转换回的正整数。

Input value number:257
 Got `257` divided to 000,001,001.
Combine: 257.
Input value number:7
 Got `7` divided to 000,000,007.
Combine: 7.

位移的应用,指针传入函数

#include <stdio.h>
#include <stdint.h>
void serialization(uint32_t value, uint8_t *disk);
uint32_t deserialize(const uint8_t *data);
int main() {
    uint32_t value;
    uint8_t data[3];
    printf("Input value number: ");
    scanf("%u", &value);
    serialization(value, data);
    printf("Got `%u` divided to %03hu,%03hu,%03hu.\n", value, data[0], data[1], data[2]);
    printf("Combine: %u.\n", deserialize(data));
    return 0;
 * @brief      : 将 value 拆分为 3 段,写入 disk 中
 * @param value: 待写入值
 * @param disk : 被写入的位置
void serialization(uint32_t value, uint8_t *disk) {
    for (int i = 2; i >= 0; i--) {
        disk[i] = value;
        value >>= 8;
 * @brief     : 将 data[0] ~ data[2] 组合为一个int变量
 * @param data: 数据保存位置
 * @return    : 组合得到的值
uint32_t deserialize(const uint8_t *data) {
    uint32_t ret = 0;
    for (int i = 0; i < 2; i++) {
        ret += data[i];
        ret <<= 8;
    ret += data[2];
    return ret;