为什么这个班次插入1s?C

为什么这个班次插入1s?C,c,bit,bit-shift,C,Bit,Bit Shift,我正在尝试创建一个32位二进制文件,除了srt之外,所有0的结尾都是1。所以如果srt是2,end是7,那么我会得到0000000000000000000111100。当我进行第二次移位时,它会给出更多的1,而不是0,我不知道为什么。非常了解C和位操作,如果有人能解释我将非常感激 int groupOne(int srt, int end){ int mask =-1; int ret; ret = 1<<end; ret=ret<<srt

我正在尝试创建一个32位二进制文件,除了srt之外,所有0的结尾都是1。所以如果srt是2,end是7,那么我会得到0000000000000000000111100。当我进行第二次移位时,它会给出更多的1,而不是0,我不知道为什么。非常了解C和位操作,如果有人能解释我将非常感激

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

    ret = mask+ret;
    return ret;
}
intgroupone(intsrt,intend){
整数掩码=-1;
int ret;

ret=1来自C委员会草案(N1570):

6.5.7位移位运算符

语义
3对每个操作数执行整数提升。结果的类型为 提升后的左操作数的值。如果右操作数的值为负或为 大于或等于提升的左操作数的宽度,行为未定义

4
E1>E2
的结果是
E1
右移
E2
位位置。如果
E1
具有无符号类型 或者,如果
E1
具有有符号类型和非负值,则结果值是
E1/2E2
(2次方E2)商的整数部分。如果
E1
具有有符号类型和负值,则结果值由实现定义


2的补码?
start
将是一个比
srt
更具信息性的参数名称@Kingsley:我同意名称的更改,除了示例似乎显示7个1位,其中第2位的值的有效性最低-因此编号为
00000001 111111 00
(写入16位而不是32位)。因此,
srt
的更好名称可能是
len
num_bits
或类似的名称。是的,对
无符号
值执行所有按位操作要容易得多。