2

在 Linux 内核模块中,对于用户模式 ​​C 的 stdint.h/limits.h 中有许多内容的定义,但标准内核头文件中明显缺少这些内容。例如以下:

#define UINT16_MIN (uint16_t)0
#define UINT16_MAX (~UINT16_MIN)
#define INT16_MAX (int16_t)(UINT16_MAX >> 1)
#define INT16_MIN (-INT16_MAX - (int16_t)1)

但是,当使用 kbuild(i386 目标)构建时,INT16_MAX 将输出到 (int16_t)-1,而 INT16_MIN 输出到 (int16_t)0。这意味着 UINT16_MAX 在右移之前由 ~ 运算符转换为 int16_t。如果 UINT16_MAX 的定义改为

#define UINT16_MAX (uint16_t)(~UINT16_MIN)

结果是正确的。这是 C 语言的某个深沉、黑暗和棕色隐士出没的角落,还是只是一个直接的编译器错误?

编辑:正如评论中所解释的,我认为提升只发生在混合参数类型或分配给与值不同的类型时,并且不知道它可能发生在一元操作中。这个问题是重复的。

4

0 回答 0