请考虑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个字节的字节顺序。我认为它必须是主机实现的任何字节顺序,或者它是否是网络,然后是严格的大端。
答案 0 :(得分:3)
由于d
的类型为char *
,因此它会在d
指向的地址处读取单个字节。因此,表达式*d
具有类型char
,其具有d
指向的字节的值。字节顺序在这里并不重要,因为只从d
读取一个字节。
在较大的表达式*d & mask
中,类型为*d
的值char
被转换为到uint32_t
,以便在表达式中使用。< / p>