首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在C#中按位操作时必须转换0(0)?

为什么在C#中按位操作时必须转换0(0)?
EN

Stack Overflow用户
提问于 2014-04-14 09:17:29
回答 1查看 1.1K关注 0票数 2

我使用以下代码来签名扩展从1.5字节到16位的12位值:

代码语言:javascript
复制
word[0] |= ((word[0] & 0x800) != 0 ? (Int16)(-4096) : (Int16)0);

如果不将最后零转换为Int16,编译器会发出以下抱怨:

代码语言:javascript
复制
Warning 1   Bitwise-or operator used on a sign-extended operand; consider casting to a smaller unsigned type first
Error   2   Cannot implicitly convert type 'int' to 'short'. An explicit conversion exists (are you missing a cast?)

为什么会这样呢?我了解到,C#在按位操作时将所有内容转换为int,但通常情况下,整数常量会自动得到正确的类型。例如,如果我将零赋值给一个浮点数,我就不必先将它转换成浮点数。我是一个C程序员,所以在回答时请记住这一点:-)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-14 09:30:47

C#中唯一的整数类型是intuintlongulong (C#语言规范,第5版,第2.4.4.2节)。任何文字(如0)都只能将其类型推断为这4种文字中的一种(而且没有任何额外的指示,它是int)。

那么,为什么:

代码语言:javascript
复制
short s = 0;

工作?这是由于隐含的常量表达式转换(第6.1.9节):

int类型的常量表达式(§7.19)可以转换为sbytebyteshortushortuintulong类型,条件是常量表达式的值在目标类型的范围内。

但是,我们在这里所做的并不是一个固定的表达。因此,所有传统的C#类型规则都起作用;在分析条件运算符(第7.14节)时,类型如下:

代码语言:javascript
复制
bool ? short : int;

编译器(不能使用上述常量表达式规则)决定该表达式的类型是int,因为short可以隐式转换为int,反之亦然。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23056327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档