c语言中带负值的位移位

c语言中带负值的位移位,c,bit-manipulation,C,Bit Manipulation,a的价值是什么, 答案是-1还是0?你能解释一下原因吗 是否发生整数除法,然后使用floor函数,或者它只是将2s中的所有1向右移位,从而导致仍然为-1,还是截断除法,从而导致0。对于C语言草案6.5.7位移位运算符5: E1>>E2的结果是E1右移位E2位位置。如果E1有 无符号类型,或者如果E1具有有符号类型和非负值, 结果的值是E1商的整数部分/ 2E2。如果E1具有有符号类型和负值,则 结果值由实现定义 这意味着它是正确的,不是一个未定义的行为,但每个编译器可能决定用1或0填充位 对于C

a的价值是什么, 答案是-1还是0?你能解释一下原因吗


是否发生整数除法,然后使用floor函数,或者它只是将2s中的所有1向右移位,从而导致仍然为-1,还是截断除法,从而导致0。

对于C语言草案6.5.7位移位运算符5:

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

这意味着它是正确的,不是一个未定义的行为,但每个编译器可能决定用1或0填充位


对于C语言草案6.5.7位移位运算符5,结果可以是-1填充1位或16383=0x3FFF填充0位

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

这意味着它是正确的,不是一个未定义的行为,但每个编译器可能决定用1或0填充位


结果可以是-1填充1位或16383=0x3FFF填充0位

当我们右移时,有符号数据类型的符号位保持不变,因此如果a等于-1,即数据的所有位都是1。如果我们做右移,不管有多少位,数据的值保持不变。所以a的值仍然是-1。这是大多数编译器的情况。但答案取决于编译器的实现。当我们右移时,有符号数据类型的符号位保持不变,因此如果a等于-1,即数据的所有位都是1。如果我们做右移,不管有多少位,数据的值保持不变。所以a的值仍然是-1。这是大多数编译器的情况。但答案取决于编译器的实现

为什么不运行代码并查看?因为我在9点钟参加tmrw书面考试,我的计算机上没有开发环境。看这里:有符号整数右移的结果是实现定义。它可能是算术移位或逻辑移位,这取决于符号位是否被传播。@joelgoldstick:幸好他没有运行代码并看到。因为这是实现定义的行为,所以他应该知道他的编译器是如何实现它的,但肯定不会知道其他编译器是如何实现它的。运行它,看看可能是一个非常危险的工具!你为什么不运行代码看看呢?因为我9点要参加tmrw的纸上考试,我的计算机上没有开发环境。看这里:有符号整数右移的结果是实现定义的。它可能是算术移位或逻辑移位,这取决于符号位是否被传播。@joelgoldstick:幸好他没有运行代码并看到。因为这是实现定义的行为,所以他应该知道他的编译器是如何实现它的,但肯定不会知道其他编译器是如何实现它的。运行它,看看可能是一个非常危险的工具!。。。或任何其他价值。定义的实现意味着实现可以按其选择的方式定义结果值,如未定义或未指定。UB和实施定义行为之间的区别在于实施手册必须记录实施定义行为。。。。或任何其他价值。定义的实现意味着实现可以按其选择的方式定义结果值,如未定义或未指定。UB和实施定义行为之间的区别在于实施手册必须记录实施定义行为。
int16_t a = -1;
a >>= 2;