如果数值表达式包含不同数值类型的操作数(常量和变量),则根据以下规则将操作数提升为更大的类型:
byte
,sbyte
,char
,short
,ushort
,则会转换为int
类型int
,则所有操作数都将转换为int
uint
和int
的操作数,则所有操作数都将转换为long
long
,则所有操作数都将转换为long
ulong
和long
的操作数,则操作数将转换为float
float
,则所有操作数都将转换为float
double
,则所有操作数都将转换为double
假设数值表达式包含不同类型的操作数,所有操作数首先会转换为单个数字类型,然后运行时才会尝试计算结果吗?例如,如果变量b1
和b2
属于byte
类型,而i1
属于int
类型,则b1
和b2 {{ 1}}在计算get
之前转换为int:
(b1+b2)
答案 0 :(得分:1)
你的规则有一些事实要素,但在技术上是不精确的。
以下是C#语言规范
的相关摘录7.2.6.2 Binary numeric promotions
对预定义
+
,–
,*
,/
,%
,&
,{的操作数进行二进制数字提升{1}},|
,^
,==
,!=
,>
,<
和>=
二元运算符。二进制数字提升隐式地将两个操作数转换为公共类型,在非关系运算符的情况下,它也成为操作的结果类型。二进制数字促销包括按照它们在此处显示的顺序应用以下规则:
- 如果任一操作数的类型为
<=
,则另一个操作数将转换为类型decimal
,否则如果另一个操作数的类型为decimal
或{{{}},则会发生编译时错误1}}。- 否则,如果任一操作数的类型为
float
,则另一个操作数将转换为double
类型。- 否则,如果任一操作数的类型为
double
,则另一个操作数将转换为double
类型。- 否则,如果任一操作数的类型为
float
,则另一个操作数将转换为类型float
,否则如果另一个操作数的类型为ulong
,则会发生编译时错误,ulong
,sbyte
或short
。- 否则,如果任一操作数的类型为
int
,则另一个操作数将转换为long
类型。- 否则,如果任一操作数的类型为
long
且另一个操作数的类型为long
,uint
或sbyte
,则两个操作数都将转换为{{1}类型1}}。- 否则,如果任一操作数的类型为
short
,则另一个操作数将转换为int
类型。- 否则,两个操作数都将转换为
long
类型。
uint
根据上述规范,是的,对于二元运算符uint
,int
需要对int i2=(b1+b2)+i1
进行二进制数字提升。
答案 1 :(得分:1)
括号的优先级高于+
,因此转换通常会在添加b1
和b2
之后进行。但是,+
的{{1}}运算符does not have an overload,byte
必须首先提升为byte
。
进一步阅读: