我正在做一个int的bithift操作,并且对它没有按预期出现感到惊讶。
int i, res;
i = 0x80000000;
res = i>>1; //results in 0xc0000000
res = (unsigned int) i>>1; //results in 0x40000000
一个整数位的移位怎么可能只能工作到第31位?
答案 0 :(得分:8)
您所看到的可能是arithmetic bit shift。
当向右移动时,最左边的位(通常是符号位) 复制有符号整数表示形式以填充所有 空缺职位(这是一种标志延伸)。
C99 standard6.5.7§5说:
E1>的结果> E2是E1右移E2位位置。 [...]如果E1具有有符号类型和负值,则为结果值 是实现定义的。
因此结果可能是编译器编写者决定的结果。他们可能决定扩展符号位,编译器文档应该提到它。