将unsigned int的位移量大于它的大小(未定义)?

Jea*_*nès 6 c language-lawyer

2011年草案说:

6.5.7按位移位运算符/ 4 E1 << E2的结果是E1左移E2位位置;空位用零填充。如果E1具有无符号类型,则结果的值为E1×2 ^ E2,与结果类型中可表示的最大值相比,其模值减少了1。如果E1具有带符号的类型和非负值,并且E1×2E2在结果类型中可表示,则这是结果值;否则,行为是不确定的。

J.2未定义的行为表达式被移位负数或大于或等于提升的表达式的宽度(6.5.7)的量。

两者如何解释?J.2是否引用了所有移位(是否是未签名的)或在6.5.7节中明确提到的UB (仅用于签名)。

我的意思是,unsigned int i=...; i <<= sizeof(i)*CHAR_BIT;UB?

Gro*_*roo 3

无论签名如何,您引用的上面的段落都说了同样的事情:

6.5.7 按位移位运算符 / 3对每个操作数执行整数提升。结果的类型是提升后的左操作数的类型。如果右操作数的值为负数或大于或等于提升的左操作数的宽度,则行为未定义。

所以,无论是未签名还是签名,它都是 UB。