对 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 将适用。 )
在下面的代码中,对一个 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 将适用。 )