C11§6.5.7第5段:是“-1 >> 5;” C中未指定的行为?
的
E1 >> E2
结果是E1
右移E2
比特位置。如果E1
具有无符号类型或者如果E1
具有带符号类型和 非负值,则结果的值是E1/2*^E2
的商的整数部分。 如果E1
具有签名类型和负值 值,则结果值是实现定义的。
但是,该viva64参考文件说:
int B; B = -1 >> 5; // unspecified behavior
我跑GCC此代码,它总是给输出-1
。
所以,标准说的是“如果E1有签署类型和负值,所得到的值是实现定义的”,但该文件说的是-1>>5;
是不确定的行为。
那么,在C中是-1>>5;
未指定的行为?哪个是对的?
如果您正在尝试编写可移植代码,那么实现定义和未指定之间的区别不是很重要,因此代码检查器会以类似方式处理它们。 – Barmar
它是实现定义的。 – chux
@chux那么,那个文件是不正确的? – rsp