此代码没有像我预期的那样返回,标识符应为0xABC.有可能修复此问题吗?

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

typedef struct {
    union {
        struct {
            uint8_t address: 8;
            uint16_t identifier: 16;
        };
        uint32_t fullAddress;
    };
} isotpAddress_t;

int main() {
    isotpAddress_t myAddress;
    
    myAddress.fullAddress = 0xABCDE;
    printf("Address: 0x%02X\n", myAddress.address);       // 输出: Address: 0xDE
    printf("Identifier: 0x%04X\n", myAddress.identifier);  // 输出: Identifier: 0x000A but want 0x0ABC

    return 0;
}

输出:

> Address: 0xDE
> Identifier: 0x000A

推荐答案

GCC只回答.

为了防止在对 struct 中的位域定义使用不同类型时填充,需要对其进行打包.

        struct {
            uint8_t address: 8;
            uint16_t identifier: 16;
        } __attribute__((packed));

https://godbolt.org/z/roa8sfGf8

或者就像@dBush建议的那样,使用相同的类型.

C++相关问答推荐

错误:在.h程序中重新定义 struct

Malloc(sizeof(char[Length]))是否不正确?

我在这里正确地解释了C操作顺序吗?

CSAPP微型shell 实验室:卡在sigprocmask

如何使用C for Linux和Windows的标准输入与gdb/mi进行通信?

判断X宏的空性

函数的限制限定指针参数允许优化调用方函数吗?

用C语言计算文本文件中的整数个数

C整型和_泛型.哪些类型是兼容的?

C将数组传递给函数以修改数组

判断系统命令返回值的正确方法

使用C++中的字符串初始化 struct 时,从‘char*’初始化‘char’使指针变为整数,而不进行强制转换

从另一个宏函数调用C宏

为什么二进制文件的大小不会随着静态数据的大小而增加?

try 查找带有指针的数组的最小值和最大值

从整型转换为浮点型可能会改变其值.

RISC-V GCC编译器错误编译ASM代码

在C中交换字符串和数组的通用交换函数

根据输入/输出将 C 编译过程分为预处理、编译、汇编和链接步骤

C11 嵌套泛型