无符号类型的大按位左移

P45*_*ent 4 c

是这样的

uint32_t foo = 1;

foo = foo << 33;
Run Code Online (Sandbox Code Playgroud)

C中的未定义行为?

too*_*ite 10

事实上,转变是未定义的行为.参见标准(C11,最终草案N1570,6.5.7p3):

"...如果右操作数的值为负或大于或等于提升的左操作数的宽度,则行为未定义." .

基本原理:如果移位计数> =参数的宽度,则移位操作在不同的CPU体系结构上的行为会有很大差异.这样,标准允许编译器生成最快的代码,而无需关心边界效应.

注意:如果int宽度超过33位(例如64位),则情况会有所不同.Reason是首先将uint32_tto 转换为的整数提升int,因此使用(然后更大的)int值执行shift .这留下了转换的转换uint32_t,见本案例见6.3.1.3第1,2段.但是,在大多数现代系统中,int不大于32位.

  • @abligh:不,不.这在以下段落中提到. (4认同)