【发布时间】:2018-06-13 17:21:06
【问题描述】:
考虑以下在 Linux 内核中运行的代码中的 sn-p:
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 个字节的 字节顺序。我认为它必须是主机实现的任何字节顺序,或者如果它是网络,那么严格来说是大端。
【问题讨论】:
-
此代码 sn-p 不依赖于字节序。它确实取决于
char的签名。 -
它被转换为uint32_t,是的。但是具体怎么做就看有没有签名了。
-
*d是一个字节,所以顺序无关紧要。 -
没关系。它在编译器内部,仅用于计算。
-
单字节
*d将被符号扩展为 32 位或零扩展为 32 位,具体取决于char是否带符号。
标签: c types linux-kernel endianness integer-promotion