C语言 | 获取一个整数各个字节的两种方法

 

题目:获取0x12345678各个字节。

方法一:结构&联合

/* 微信公众号:嵌入式大杂烩 */
#include <stdio.h>

typedef unsigned int  uint32_t;
typedef unsigned char uint8_t;

union bit32_data
{
    uint32_t data;
    struct 
    {
        uint8_t byte0;
        uint8_t byte1;
        uint8_t byte2;
        uint8_t byte3;
    }byte;
};

int main(void)
{
    union bit32_data num;
    
    num.data = 0x12345678;

    printf("byte0 = 0x%x\n", num.byte.byte0);
    printf("byte1 = 0x%x\n", num.byte.byte1);
    printf("byte2 = 0x%x\n", num.byte.byte2);
    printf("byte3 = 0x%x\n", num.byte.byte3);

    return 0;
}

运行结果:

这种方法的缺点是:会受到大小端的影响。只有在明确大小端的情况下可稍微用一用。以上是小端模式下的运行结果。

结构&联合法不仅仅是在获取数据各个字节有用,在数据协议、数据位拆分等方面很实用,之后再做更详细的分享。大小端推荐文章:《CPU 的大小端模式?》

方法二:移位操作

/* 微信公众号:嵌入式大杂烩 */
#include <stdio.h>

#define GET_LOW_BYTE0(x) ((x >>  0) & 0x000000ff) /* 获取第0个字节 */
#define GET_LOW_BYTE1(x) ((x >>  8) & 0x000000ff) /* 获取第1个字节 */
#define GET_LOW_BYTE2(x) ((x >> 16) & 0x000000ff) /* 获取第2个字节 */
#define GET_LOW_BYTE3(x) ((x >> 24) & 0x000000ff) /* 获取第3个字节 */

int main(void)
{
 unsigned int a = 0x12345678;
 
 printf("byte0 = 0x%x\n", GET_LOW_BYTE0(a));
 printf("byte1 = 0x%x\n", GET_LOW_BYTE1(a));
 printf("byte2 = 0x%x\n", GET_LOW_BYTE2(a));
 printf("byte3 = 0x%x\n", GET_LOW_BYTE3(a));
 return 0;
}

运行结果:

这也是获取数据各个字节的最常用也最有效的方法。这种类似的位操作在嵌入式方面应用得很多,比如在LCD操作中表示像素颜色值、FLASH的操作等方面都有用到。位操作推荐文章:《C语言、嵌入式位操作精华技巧大汇总》

最后

以上就是本次的分享,如果觉得文章不错,转发、在看,也是我们继续更新的动力。

猜你喜欢:

嵌入式大杂烩读者福利:第二期

2020年精选原创笔记汇总

干货 | protobuf-c之嵌入式平台使用


1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。关注微信公众号【嵌入式大杂烩】,回复1024,即可免费获取!


 

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
下面是一个使用冒泡排序算法的通用排序函数实现: ```c #include <stdio.h> void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } void bubbleSort(int arr[], int n) { int i, j; for (i = 0; i < n-1; i++) { for (j = 0; j < n-i-1; j++) { if (arr[j] > arr[j+1]) { swap(&arr[j], &arr[j+1]); } } } } void genericSort(void *arr, int n, int size, int (*compar)(const void *, const void *)) { int i, j; char *p = (char *)arr; for (i = 0; i < n-1; i++) { for (j = 0; j < n-i-1; j++) { if (compar(p+j*size, p+(j+1)*size) > 0) { swap((int *)(p+j*size), (int *)(p+(j+1)*size)); } } } } int compare(const void *a, const void *b) { return (*(int *)a - *(int *)b); } int main() { int arr[] = {5, 2, 8, 1, 6}; int n = sizeof(arr)/sizeof(arr[0]); int i; genericSort(arr, n, sizeof(int), compare); printf("Sorted array: "); for (i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; } ``` 该程序中的 `bubbleSort` 函数是一个标准的冒泡排序实现,它将整数数组作为输入,并将其按升序排序。 `genericSort` 函数是一个通用排序函数,它可以用于对任何类型的数组进行排序,只要提供一个指向比较函数的指针。该函数使用了 void 指针和 char 指针来处理任意类型的数组,以及指针的算术运算来遍历数组元素。 `compare` 函数是一个用于比较两个整数的函数,它在本例中被用作比较函数。 在主函数中,我们首先声明一个整数数组,然后调用 `genericSort` 函数来排序该数组。最后,我们遍历数组并打印出排序后的结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式大杂烩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值