按位运算的整数提升和字节序问题
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;
如你所见只有d
是char *
类型,其余都是无符号整数。我知道 C 在以下情况下会自动执行类型转换
不同类型的值参与表达式,在这种情况下
位运算。所以,我假设可以保证 *d
也会被提升为 uint32_t
?
如果这个假设是正确的,我的第二个问题将是关于位于 d
指向的内存中的 4 个字节的 字节顺序 。我认为它必须是主机实现的任何字节顺序,或者如果它是网络,那么严格是大端。
因为 d
的类型为 char *
,它在 d
指向的地址读取 单个 字节。所以表达式 *d
的类型 char
具有 d
指向的字节的值。字节顺序在这里并不重要,因为只从 d
.
读取一个字节
在较大的表达式*d & mask
中,类型为char
的值*d
被转换为uint32_t
以供使用在表达式中。
考虑 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 个字节的 字节顺序 。我认为它必须是主机实现的任何字节顺序,或者如果它是网络,那么严格是大端。
因为 d
的类型为 char *
,它在 d
指向的地址读取 单个 字节。所以表达式 *d
的类型 char
具有 d
指向的字节的值。字节顺序在这里并不重要,因为只从 d
.
在较大的表达式*d & mask
中,类型为char
的值*d
被转换为uint32_t
以供使用在表达式中。