C左移运算中的模数行为

时间:2017-06-20 09:24:15

标签: c binary bit-manipulation

按位移位算子的ISO C99标准说左移:

  

E1的结果<< E2是E1左移E2位位置;腾出的位用零填充。如果E1具有无符号类型,则结果的值为E1×2E2,比结果类型中可表示的最大值减少一个模数。如果E1具有带符号类型和非负值,并且E1×2E2在结果类型中可表示,那么这就是结果值;否则,行为未定义。

我不明白什么意思是什么意思是说“减少模数比结果类型中可表示的最大值”在移位位的上下文中。

2 个答案:

答案 0 :(得分:1)

这基本上是在谈论integer wrapping。如果数学值大于该类型的最大可表示值,则它将换行,即模运算

答案 1 :(得分:1)

结果类型中可表示的最大值将设置其所有位,而不是单个2的幂。但是,完成模运算的次数(当值开始换行时)是2的幂,即下一个,可以通过将一个加到最大的可表示值来获得。