对 8 位无符号整数执行按位运算

Bitwise operations performed on an 8 bit unsigned int

在下面的代码中,对一个 8 位无符号整数执行按位运算。

uint8_t i = 10;
uint8_t j = i>>2;

在此示例中,i 被提升为 signed int 并将值分配给 8 位 unsigned int。将 int 转换回 8 位 unsigned int 是否安全?

没有

在算术表达式中,如果可能,较小的类型将转换为 int,否则将转换为 unsigned int(参见 6.3.1.1p2)。

实际上,

uint8_t i = 10;
puts(_Generic(i>>2, uint8_t: "u8", int: "int", unsigned int: "uint"));

应该输出 "int",也应该

uint8_t i = 10, j = 2;
puts(_Generic(i>>j, uint8_t: "u8", int: "int", unsigned int: "uint"));

(在前一个示例中,i 也将提升为 int,因为 2 属于 int 类型,并且 usual arithmetic conversions 将适用。 )