在此代码中:
unsigned short int i = 3;
unsigned short int x = 30;
unsigned short int z = (~x) >> i;
在第三行看来,即使我使用括号,它首先进行移位然后补充(〜)。
但是,如果我将short
替换为long
,则不会出现奇怪的结果。
它发生在Windows和Unix中。那是为什么?
答案 0 :(得分:2)
它完全按照您规定的顺序执行操作。
但是,操作数不是无符号短整数。在执行操作之前,整数提升会将x
和i
转换为良好的旧常规已签名整数。引用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
是一个负整数(其中一个正好取决于有符号整数的值表示)。
以上所有这些都可能导致您在将其转换回无符号短整数时未获得预期结果。