逐位运算和endiannes问题的整数提升

时间:2018-06-13 17:21:06

标签: c types linux-kernel endianness integer-promotion

请考虑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;

如您所见,d只有char *类型,其余为无符号整数。我知道C会自动执行类型转换 在这种情况下,不同类型的值参与表达式 按位操作。那么,我假设保证*d也会被提升为uint32_t

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

1 个答案:

答案 0 :(得分:3)

由于d的类型为char *,因此它会在d指向的地址处读取单个字节。因此,表达式*d具有类型char,其具有d指向的字节的值。字节顺序在这里并不重要,因为只从d读取一个字节。

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