按位运算的整数提升和字节序问题

integer promotion of bit-wise operation and endiannes issue

考虑 Linux 内核中代码 运行 的以下片段:

    char *d;
    u32 mask, step, val;
    ...
    /* d is initialized with valid pointer pointing at buffer,
and mask, step and val are initialized to some sane values as well. */
    ...
    val = (*d & mask) >> step;

如你所见只有dchar *类型,其余都是无符号整数。我知道 C 在以下情况下会自动执行类型转换 不同类型的值参与表达式,在这种情况下 位运算。所以,我假设可以保证 *d 也会被提升为 uint32_t

如果这个假设是正确的,我的第二个问题将是关于位于 d 指向的内存中的 4 个字节的 字节顺序 。我认为它必须是主机实现的任何字节顺序,或者如果它是网络,那么严格是大端。

因为 d 的类型为 char *,它在 d 指向的地址读取 单个 字节。所以表达式 *d 的类型 char 具有 d 指向的字节的值。字节顺序在这里并不重要,因为只从 d.

读取一个字节

在较大的表达式*d & mask中,类型为char的值*d转换uint32_t以供使用在表达式中。