为什么此班次插入1s? C

时间:2018-10-04 04:55:25

标签: c bit bit-shift

我正在尝试创建一个全0的32位二进制文​​件,但srt结束时将为1s。因此,如果srt是2,而end是7,则我将得到00000000 00000000 0000000111111100。当我进行第二次移位时,它将给出更多的1而不是零,我不知道为什么。我对C和位操作非常了解,如果有人可以解释我将不胜感激。

int groupOne(int srt, int end){
    int mask =-1;
    int ret;
    ret = 1<<end;
    ret=ret<<srt;

    ret = mask+ret;
    return ret;
}

1 个答案:

答案 0 :(得分:2)

来自C委员会(N1570)的草案:

  

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

     

4 E1 << E2的结果是E1个左移E2位的位置;空位用零填充。如果E1具有无符号类型,则结果的值为E1 × 2E2(2幂E2),比结果类型中可表示的最大值多模减1。如果E1具有带符号的类型且非负值,并且E1 × 2E2(2幂E2)在结果类型中是可表示的,则它是结果值;否则,行为是不确定的。

     

5 E1 >> E2的结果是E1个右移E2位的位置。如果E1具有未签名的类型   或者E1具有带符号的类型且非负值,则结果的值是E1 / 2E2的商(2幂E2)的整数部分。如果E1具有带符号的类型和负值,则结果值是实现定义的。