2017-10-15 165 views
2

在此代码:反向移位和按位求补的优先级中的表达

unsigned short int i = 3; 
unsigned short int x = 30; 
unsigned short int z = (~x) >> i; 

在第三行似乎它确实第一移位,然后将补体(〜),甚至当我使用括号。

但是,如果我有long取代short不会出现奇怪的结果。它发生在Windows和Unix中。这是为什么?

+0

请解释一下你是怎么想的。 – Yunnosch

+0

您是否打印了中间结果((〜x),(x >> 3),(〜x)>> 3,〜(x >> 3))?他们是什么? – Yunnosch

+0

'〜'运算符是* not *否定,并且没有人像这样引用它。它是按位补数运算符。 –

回答

2

它正好在你规定的顺序进行操作。

然而,操作数不是无符号整数短。积分促销变成xi到良好的旧规则签署预成型操作之前整数。引述C标准在此:

6.3.1 Arithmetic operands/paragraph 2

以下可以在表达式中使用的任何地方可使用int或unsigned INT:

  • 的物体或表达与整数类型(int或unsigned int除外),其整数转换等级小于或等于 int和unsigned int的等级。

如果int可以表示原始类型(如由宽度限制 ,对于一个位字段),值被转换为int的所有值; 否则,它被转换为一个unsigned int。

未签名的短裤可以紧贴在您尝试使用的机器上的有符号整数。

负值此外,右移位带符号的整数还实现定义的结果:

6.5.7 Bitwise shift operators/paragraph 5

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

~x是一些负整数(精确地依赖于有符号整数的值表示)。

上述所有更多的则可能占到其转换回时为无符号的短整型你没有得到预期的结果。

+0

非常感谢你的故事出纳员。现在很清楚。 –

+0

@IrisGaber - 我的荣幸 – StoryTeller