-1

在此处的第 14 页:

http://www.cs.nyu.edu/~cconway/teaching/cs1007/notes/types.pdf

始终假设转换适合:

阅读 Columbia 的笔记,它指出 long 将自动转换为 int/short/byte ,并且 int 将自动转换为 short/byte ,但忽略了最后一个明显的转换( short 到 byte )。

这种遗漏是一个错误还是实际上是语言的功能方式?

有什么方法可以测试这个吗?

这里是图形化的

  • 长->整数,短,字节
  • int->短,字节
  • 短->字节
  • 字节
4

1 回答 1

7

首先,请注意本文是在讨论编译时常量表达式。只有编译时常量表达式才允许窄化转换。从语言规范,第 5.2 节

此外,如果表达式是 byte、short、char 或 int 类型的常量表达式(第 15.28 节):

  • 如果变量的类型是 byte、short 或 char,并且常量表达式的值可以用变量的类型表示,则可以使用窄化原语转换。

由于没有文字值,因此存在从编译时常量short到的隐式缩小赋值转换这一事实并不是很明显;只有和。要获得编译时间常数,您必须使用以下技巧之一:byteshortintlongshort

// Casting:
byte b2 = (short) 42;

// Compile-time constant short value:
static final short s = 42;
byte b = s;

另一方面,您的讲义还说从longtoint和更小的整数类型存在隐式缩小转换。这是不正确的,只能在表达式类型为byteshortchar或时使用转换int。他们用来说明的代码片段会产生编译时错误:

int i = 0x12345678L; /* "error: possible loss of precision" */
于 2013-09-19T13:14:17.450 回答