如果数字表达式包含不同数字类型的操作数(常数和变量),则根据以下规则将操作数促进到较大类型:

  1. 如果操作数是类型的 byte, sbyte, char, short, ushort, ,他们被转换为 int 类型
  2. 如果操作数之一是 int, ,然后将所有操作数转换为 int
  3. 如果表达式还包含类型的操作数 uintint, ,然后将所有操作数转换为 long
  4. 如果操作数之一是 long, ,然后将所有操作数转换为 long
  5. 如果表达式包含类型的操作数 ulonglong, ,然后将操作数转换为 float
  6. 如果操作数之一是 float, ,然后将所有操作数转换为 float
  7. 如果操作数之一是 double, ,然后将所有操作数转换为 double

假设数字表达式包含不同类型的操作数,所有操作数将首先转换为单个数字类型,只有这样,运行时才能尝试计算结果?例如,如果变量 b1b2byte 类型,而 i1int 类型,威尔 b1 和B2 get 在计算之前转换为int (b1+b2):

int i2=(b1+b2)+i1
有帮助吗?

解决方案

括号比 +, ,因此通常会在 b1b2 已添加。然而 + 操作员 没有超负荷 为了 byteS,所以 byteS必须首先晋升为 ints。

进一步阅读:

其他提示

您的规则有一些真理的要素,但从技术上讲是不精确的。

这是C#语言规范的相关摘录

7.2.6.2二进制数字促销

预定义的操作数发生了二进制数字促销 +, , *, /, %, &, |, ^, ==, !=, >, <, >=, , 和 <= 二进制操作员。二进制数字促销将这两个操作数隐含地转换为一种公共类型,如果非关系运算符也成为操作的结果类型。二进制数字促销包括按以下顺序应用以下规则:

  • 如果两个操作数为类型 decimal, ,另一个操作数转换为类型 decimal, ,或者如果其他操作数为类型,则会发生编译时间错误 float 或者 double.
  • 否则,如果任何操作数都是类型 double, ,另一个操作数转换为类型 double.
  • 否则,如果任何操作数都是类型 float, ,另一个操作数转换为类型 float.
  • 否则,如果任何操作数都是类型 ulong, ,另一个操作数转换为类型 ulong, ,或者如果其他操作数为类型,则会发生编译时间错误 sbyte, short, int, , 或者 long.
  • 否则,如果任何操作数都是类型 long, ,另一个操作数转换为类型 long.
  • 否则,如果任何操作数都是类型 uint 另一个操作数是类型 sbyte, short, , 或者 int, ,两个操作数转换为类型 long.
  • 否则,如果任何操作数都是类型 uint, ,另一个操作数转换为类型 uint.
  • 否则,将两个操作数转换为类型 int.

int i2=(b1+b2)+i1

根据上面的规范,是的, byte b1, b2 受到二元数字促进的约束 int 对于二进制操作员 +.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top