位移是否会自动将字符提升为int?

我在某处读到按位移位会自动将操作数转换为int。 但是我不确定该语句是否应该用“如果操作数是不相等的类型”来限定。

char one = 1, bitsInType = 8; one << (bitsInType - one); 

第二行的默认结果是否导致int或char?

在正常的C实现中,结果类型是int1

Per C 2011(N1570)6.5.7,“对每个操作数执行整数提升。 结果的类型是提升的左操作数的类型。“

根据6.3.1.1 2,整数提升对于整数类型的对象或表达式,其等级小于或等于intunsigned int的等级:“如果int可以表示原始类型的所有值(由width,对于位字段),该值被转换为int ; 否则,它将转换为unsigned int 。“


1 Stack Overflow中的其他地方已经有过讨论,似乎奇怪的C实现可能有一个与int相同宽度的char ,这会导致一些不寻常的行为。

C11标准,第6.5.7节按位移位运算符,状态:

对每个操作数执行整数提升。 结果的类型是提升的左操作数的类型。

这意味着将值转换为int ,然后执行操作; 表达式的结果是int