2015-05-09 78 views
4

如果赋值和数学运算中的每个操作数在执行表达式之前被提升为int(如果它没有L, f, d标志);窄铸造int到更小的类型

并且将int放入较小的原始类型(如byte)应该用narrow-casting完成;

那么下面的分配是如何工作的?

byte a = 100; 

如果100是一个整数,所以把它放入一个字节需要铸造。

+0

这是一个缩小的转换,而不是铸造;铸造不会改变目标值。 – chrylis

回答

2
byte a = 100; 

此操作,因为...

如果在assignment context右手侧是常量表达式,

甲基本收缩转换可以如果类型被使用的变量是byte,shortchar,并且常量表达式的值可以用变量的类型表示。

字面原始类型的[...]

是一个constant expression

而且range of a byte

[...]从-128127,包容性。

+0

感谢您的文档链接 – mrdaliri

1

这是一个编译时常量,编译器可以确定它适合一个字节。实际上,这确实需要在旧版本的Java中进行缩小转换。

+0

所以如果它是一个常量,编译器知道它是否合适,但如果它是一个表达式,它会在执行结果后强制执行? – mrdaliri

2
byte a = 100; 

这工作,因为在Java字节范围为-128 to 127,所以如果你高达127赋值,就没有必要对投。

试着指定128,你会得到编译器错误。

byte a = 128 ; //compiler error(incompatible type) 
byte a = (byte)128;