c - 在 C 中将变量读取为更大的类型

标签 c c99

当读取或写入缓冲区时,我相信通常需要访问大于缓冲区类型(指针)的数据。到目前为止,我已经提出了三种不同的方法,但我想知道是否有针对此的语言功能或公认的标准做法。选项 c 提供了最大的灵 active ,因为它可以处理结构和数组以及整数类型。

#include <stdio.h>
#include <stdint.h>

#define BUFFER_SIZE 10
#define ADDRESS 6

uint8_t buffer[BUFFER_SIZE] =
{
    [ADDRESS] = 0x37,
    [ADDRESS+1] = 0x42,
};

int main(void)
{
    uint16_t a = buffer[ADDRESS] + (buffer[ADDRESS + 1]<<8);
    uint16_t b = *(buffer + ADDRESS) + (*(buffer + ADDRESS + 1)<<8);
    uint16_t c = *((uint16_t *) (buffer + ADDRESS));

    printf("a: 0x%x\n", a);
    printf("b: 0x%x\n", b);
    printf("c: 0x%x\n", c);

    return 0;
}

我不关心字节顺序,因为与缓冲区的所有交互都在单个嵌入式程序中;独立提供字节顺序安全的外部接口(interface)。最受关注的标准是 C99,但欢迎引用任何标准。

最佳答案

前两个是等价的,这里buffer[ADDRESS]*(buffer + ADDRESS)是一样的

uint16_t a = buffer[ADDRESS] + (buffer[ADDRESS + 1]<<8);
uint16_t b = *(buffer + ADDRESS) + (*(buffer + ADDRESS + 1)<<8);

最后一个调用未定义的行为,因为它违反了 C 别名规则 (C99, 6.5p7) 并且可能会破坏对齐:

uint16_t c = *((uint16_t *) (buffer + ADDRESS));

总而言之,选择第一个,因为它更具可读性。

关于c - 在 C 中将变量读取为更大的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23697560/

相关文章:

一个文件描述符可以被复制多次吗?

c# - 通过 C 库在 C# 应用程序之间共享数据

c - 我们应该使用什么语言来让人们扩展我们的终端/嗅探器程序?

c - 使用 'typedef'保证逻辑类型安全

c - 函数指针的 uintptr_t/intptr_t 等价物?

c - 用户定义的最小和最大函数的奇怪行为

c - 如何在给定数组中查找重复项并在c中对它们求和

c - 我所有的局部变量都被删除

c - C99 中 _Bool 的用途是什么?

c99 - 将限制限定符与 C99 可变长度数组 (VLA) 一起使用