当前位置:  开发笔记 > 编程语言 > 正文

原始类型'短' - 用Java编写

如何解决《原始类型'短'-用Java编写》经验,为你挑选了5个好方法。

我对shortJava中的原始类型有疑问.我使用的是JDK 1.6.

如果我有以下内容:

short a = 2;
short b = 3;
short c = a + b;

编译器不想编译 - 它说它"无法从int转换为short"并建议我进行转换short,所以这样:

short c = (short) (a + b);

确实有效.但我的问题是为什么我需要施放?a和b的值在short- 范围内 - 短值范围是{-32,768,32767}.我还需要在我想执行操作时进行投射 - ,*,/(我没有检查过其他人).

如果我对原始类型做同样的int事情,我不需要将aa + bb转换为int.以下工作正常:

int aa = 2;
int bb = 3;
int cc = aa +bb;

我在设计一个类时需要添加两个类型为short的变量,并且编译器希望我进行转换.如果我用两个类型的变量做这个int,我不需要强制转换.

一句小话:原始类型也会发生同样的事情byte.所以,这有效:

byte a = 2;
byte b = 3;
byte c = (byte) (a + b);

但这不是:

byte a = 2;
byte b = 3;
byte c = a + b;

对于long,float,double,和int,也没有必要投.仅限于shortbyte价值观.



1> VonC..:

正如简短的C#所解释的那样(但也适用于其他语言编译器,如Java)

存在从short到int,long,float,double或decimal的预定义隐式转换.

您不能隐式地将较大存储大小的非平面数字类型转换为short(有关整数类型的存储大小,请参阅"积分类型表").例如,考虑以下两个短变量x和y:

short x = 5, y = 12;

以下赋值语句将产生编译错误,因为赋值运算符右侧的算术表达式默认情况下计算为int.

short z = x + y;   // Error: no conversion from int to short

要解决此问题,请使用强制转换:

short z = (short)(x + y);   // OK: explicit conversion

虽然可以使用以下语句,但目标变量具有相同的存储大小或更大的存储大小:

int m = x + y;
long n = x + y;

一个很好的后续问题是:

"为什么赋值运算符右侧的算术表达式默认值为"?

第一个答案可以在:

分类和形式验证整数常量折叠

Java语言规范定义的数字究竟是如何整数中表示,如何整数算术表达式进行评估.这是Java的一个重要属性,因为这种编程语言被设计用于Internet上的分布式应用程序.需要Java程序才能独立于执行它的目标机器生成相同的结果.

相比之下,C(以及大多数广泛使用的命令式和面向对象编程语言)更加草率,并留下许多重要的特征.这种不准确的语言规范背后的意图是清楚的.通过使用内置在目标处理器中的算术运算来实例化源程序的整数算术,相同的C程序应该在16位,32位甚至64位架构上运行.这导致更高效的代码,因为它可以直接使用可用的机器操作.只要整数计算仅处理"足够小"的数字,就不会出现不一致.

从这个意义上讲,C整数算术是占位符,它不是由编程语言规范精确定义,而是仅通过确定目标机器来完全实例化.

Java精确定义了如何表示整数以及如何计算整数运算.

      Java Integers
--------------------------
Signed         |  Unsigned
--------------------------
long  (64-bit) |
int   (32-bit) |
short (16-bit) |  char (16-bit)
byte  (8-bit)  |

Char是唯一的无符号整数类型.其值表示Unicode字符,从\u0000\uffff的,即从0到2 16 -1.

如果整数运算符具有long类型的操作数,则另一个操作数也将转换为long类型.否则,对int类型的操作数执行操作,如果需要,将较短的操作数转换为int.转换规则已准确指定.

[摘自理论计算机科学中的电子笔记82第2期(2003年)
Blesner-Blech-COCV 2003:Sabine GLESNER,Jan Olaf BLECH,
FakultätfürInformatik,
UniversitätKarlsruheKarlsruhe
,Germany]



2> Jon Skeet..:

编辑:好的,现在我们知道它是Java ...

Java语言规范的4.2.2节说明:

Java编程语言提供了许多作用于整数值的运算符:

[...]

数值运算符,其结果为int或long类型的值:

[...]

加法运算符+和 - (§15.18)

换句话说,它就像C# - 加法运算符(当应用于整数类型时)只会产生intlong,这就是你需要转换为赋值给short变量的原因.

原始答案(C#)

在C#中(你没有指定语言,所以我猜),原始类型的唯一加法运算符是:

int operator +(int x, int y);
uint operator +(uint x, uint y);
long operator +(long x, long y);
ulong operator +(ulong x, ulong y);
float operator +(float x, float y);
double operator +(double x, double y);

这些是在C#3.0规范的7.7.4节中.另外,定义了十进制加法:

decimal operator +(decimal x, decimal y);

(枚举添加,字符串连接和委托组合也在那里定义.)

如您所见,没有short operator +(short x, short y)运算符 - 因此两个操作数都隐式转换为int,并使用int形式.这意味着结果是"int"类型的表达式,因此需要强制转换.



3> Rik..:

在C#和Java中,赋值右侧的算术表达式默认情况下计算为int.这就是为什么你需要强制转换为short,因为没有隐式转换形式int为short,原因很明显.



4> kdgregory..:

鉴于"为什么int默认"问题尚未得到解答......

首先,"默认"并不是真正合适的术语(虽然足够接近).正如VonC所指出的,由int和long组成的表达式将有很长的结果.由int/logs和double组成的操作将产生双重结果.编译器将表达式的术语提升到任何类型,在结果中提供更大的范围和/或精度(浮点类型被假定具有比积分更大的范围和精度,尽管丢失精度将大长度转换为加倍).

需要注意的是,此促销仅适用于需要它的条款.因此,在下面的示例中,子表达式5/4仅使用整数值,并使用整数数学执行,即使整个表达式涉及double.结果不是你所期望的......

(5/4) * 1000.0

好的,那么为什么byte和short被提升为int?没有任何参考支持,这是由于实用性:字节码数量有限.

顾名思义,"字节码"使用单个字节来指定操作.例如iadd,它增加了两个整数.目前,定义了205个操作码,每个类型的整数数学运算为18(即整数和长整数之间为36),不包括转换运算符.

如果short,并且每个字节都有自己的操作码集,那么你将处于241,这限制了JVM扩展的能力.正如我所说,没有提及支持我,但我怀疑Gosling等人说"人们多久经常使用短裤?" 另一方面,将byte转换为int会导致这种不那么精彩的效果(预期答案为96,实际为-16):

byte x = (byte)0xC0;
System.out.println(x >> 2);



5> Darron..:

你用的是哪种语言?

许多基于C的语言都有一个规则,即任何数学表达式都以int或更大的大小执行.因此,一旦添加两个short,结果就是int类型.这导致需要演员.

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有