是这样的
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位.