C 移动超过最大极限,产生周期序列

C 移动超过最大极限,产生周期序列,c,undefined-behavior,C,Undefined Behavior,我编写了以下代码并在CodeBlocks IDE上执行: main() { unsigned char num=1; unsigned char i=0; for(i=0;i<255;i++) { printf("%d\n",num>>i); } } 输出: 1,0,0,…31,0,1,0..31,0 num的任何值都会生成一个周期序列 我知道为num转换limitmem size是一种未定义的行为,但为什么它是周期性的呢 即使您左移,也会生成周期性序列,这是

我编写了以下代码并在CodeBlocks IDE上执行:

main()
{
 unsigned char num=1;
 unsigned char i=0;

 for(i=0;i<255;i++)
 {
  printf("%d\n",num>>i);
 }
}
输出: 1,0,0,…31,0,1,0..31,0

num的任何值都会生成一个周期序列


我知道为num转换limitmem size是一种未定义的行为,但为什么它是周期性的呢


即使您左移,也会生成周期性序列,这是允许的,因为这可能是未定义行为的表现


不要依赖于它。

它可以是周期性的,因为这可能是未定义行为的表现


不要依赖于它。

我知道,对于num,超出limitmem size是一种未定义的行为,但为什么它是周期性的呢?你不认为你的陈述是矛盾的吗?Undefined=没有特定的通用逻辑,Periodic=我可以放置一个逻辑,说明它何时会重复,因为某些assember 32位移位指令只接受5位的正确操作,所以num>>i将是num>>i&0x1F。它看起来像是一个旋转,而不是一个移位。在几个不同的CPU系列上尝试它。我知道num的移位超过limitmem size是未定义的行为,但为什么它是周期性的?你不认为你的陈述是矛盾的吗?Undefined=没有特定的通用逻辑,Periodic=我可以放置一个逻辑,说明它何时会重复,因为某些assember 32位移位指令只接受5位的正确操作,所以num>>i将是num>>i&0x1F。它看起来像是一个旋转,而不是一个移位。在几个不同的CPU系列上尝试一下。我刚刚在我的CPU上尝试过。编译器只是想吃掉我的猫。虽然我现在正在考虑更换编译器供应商;-你的输出是什么?一个看似不合理的猫翼跳水。我刚刚在我的身上试过。编译器只是想吃掉我的猫。虽然我现在正在考虑更换编译器供应商;-你的输出是什么?对猫扑来说,这似乎是不理性的跳水。