Bitshifting Int16 仅适用于文字

Posted

技术标签:

【中文标题】Bitshifting Int16 仅适用于文字【英文标题】:Bitshifting Int16's only works with literals 【发布时间】:2012-10-19 23:10:49 【问题描述】:

当我在 VS 中编写此代码时,它不起作用(“无法将 'int' 隐式转换为 'short'。存在显式转换。您是否缺少强制转换?”):

short A = 5;
short B = 1 << A;

但这段代码绝对没问题:

short A = 1 << 5;

我知道我可以通过将整个表达式转换为一个简短的表达式来消除错误,但是谁能告诉我为什么会发生这种情况?

【问题讨论】:

听起来移位运算符需要一个短的,而不是一个 int...C# 是强类型的。 @TheZ Er,看起来A 被声明为短片。因此混乱。 【参考方案1】:

因为 A 不是文字,编译器不知道 result 可以表示为 short。因此它需要一个明确的演员表。使用文字 5,编译器会看到结果是 32,它可以放入 short

【讨论】:

在我看来,因为 A 在编译时被赋值为 5,它可以得出与文字 5 相同的结论。但我猜编译器假设可能有代码会改变 A 的值在分配和位移之间,它不够聪明,无法尝试确定 A 是否在两者之间重新分配。 对,和Java一样。但是对于像1 &lt;&lt; 5 这样的常量表达式,编译器可以看到没有数据丢失。【参考方案2】:

C# 语言规范 4.0 在 6.1.9 中声明:

int 类型的常量表达式(第 7.18 节)可以转换为类型 sbyte、byte、short、ushort、uint 或 ulong,提供 常量表达式在目标类型的范围内。

常量表达式的转换是隐式转换的特殊情况之一(6.1)。

【讨论】:

以上是关于Bitshifting Int16 仅适用于文字的主要内容,如果未能解决你的问题,请参考以下文章

为啥 SVG 视图框属性仅适用于内联 SVG?

DateTimePicker 仅适用于当前月份

boost::mpl::apply 仅适用于类型化模板参数

jqGrid filterToolbar 仅适用于某些列

仅适用于数值类型的泛型类型约束

为啥 F# 中的幂运算符仅适用于浮点数?