我正在try 创建一个联合来逐个通道地存储我的 colored颜色 值和同时存储4字节值.但我对频道的顺序有问题.不同的字符顺序机器提供不同的值.当不同的字节顺序更适合这项工作时,有没有办法创建此 struct 的字节顺序验证版本或使用不同的 struct ?我想将 struct 和联合用于教育目的.我正在进行实验,希望了解C struct 可以做什么,不可以做什么.

typedef union u_color
{
    struct
    {
        unsigned char   blue;
        unsigned char   green;
        unsigned char   red;
        unsigned char   alpha;
    };
    unsigned int    value;
}   t_color;

推荐答案

如果您只想使用它来获取和设置value(或从value中获取 colored颜色 ),那么(如果您使用最新的GCC家族编译器)

typedef union u_color
{
  #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
    struct
    {
        uint8_t   blue;
        uint8_t   green;
        uint8_t   red;
        uint8_t   alpha;
    };
  #else
    struct
    {
        uint8_t   alpha;
        uint8_t   red;
        uint8_t   green;
        uint8_t   blue;
    };
  #endif
    uint32_t    value;
}   t_color;

但是对于表示实际屏幕数据 struct 的定义数组,您需要使用一个预定义的 struct 布局.

int main(void)
{
    t_color x = {.blue = 0x11, .green = 0x22, .red = 0x33, .alpha = 0x44};
    printf("%"PRIx32"\n", x.value);
}

将始终打印0x11223344,而不考虑字符顺序.

C++相关问答推荐

漏洞仅出现在FreeBSD上,但在Windows、Linux和MacOS上运行得非常好

通过管道将一个子系统的标准输出发送到另一个子系统的标准输出

C语言中字符数组声明中的标准

在#include中使用C宏变量

C中的指针增量和减量(*--*++p)

为静态库做准备中的奇怪行为

调用mProtection将堆栈上的内存设置为只读,直接导致程序SIGSEGV

GTK3按钮信号错误

在每种If-Else情况下执行语句的最佳方式

S的这种管道实施有什么问题吗?

如何在C++中安全地进行浮点运算

在进程之间重定向输出和输入流的问题

当内存来自Malloc时,将char*转换为另一个指针类型是否违反了严格的别名规则?

对于STM32微控制器,全局偏移表.get和.Got.plt必须为零初始化

Linux/C:带有子进程的进程在添加waitid后都挂起

生成的头文件不包括用户定义的文件

clion.我无法理解 Clion 中发生的 scanf 错误

在 C/C++ 中原子按位与字节的最佳方法?

快速准确计算double的小数指数

Clang 是否为内联汇编生成了错误的代码?