2013-10-06 72 views
0

我已经在windows上的eclipse上编写了我的第一个java程序。我最近开始在linux上编程java。java:简单类型转换

当我尝试在Linux上编译上述程序时,它确实工作正常,但是当我尝试在Windows上执行时,出现以下错误。

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
    Type mismatch: cannot convert from int to short 
    Type mismatch: cannot convert from double to float 

public class TypeDemo { 

    public static void main (String args[]) 
    { 
      byte b = 8; 
      long a = 1000011334; 
      int c = 76; 
      short s = 99789; 

      float f = 99.99; 
      double d = 99979.9879; 
      boolean bool = true; 
      char ch = 'y'; 

      System.out.println ("b = "+b); 
      System.out.println ("a = "+a); 
      System.out.println ("c = "+c); 
      System.out.println ("s = "+s); 
      System.out.println ("f = "+f); 
      System.out.println ("d = "+d); 
      System.out.println ("bool = "+bool); 
      System.out.println ("ch = "+ch); 
    } 
} 
+1

如果有的话,这段代码在Linux上编译很奇怪。你使用什么编译器?它真的是完全相同的代码吗? – Dolda2000

回答

4

当我尝试编译在Linux上面的程序它做工精细

这其实相当惊人的,我不能买它。再次检查它,它不应该。

short是一个16位有符号2的补码整数。它的最大值是32767,并且您正在为其分配99789。这绝对是超出范围。您需要明确地将其转换为short

short s = (short)99789; 
short s1 = 100; // this would however work 

尽管您会在那里看到奇怪的输出。额外的位将被截断。直接使用int更好。

现在,在float的情况下,浮点文字默认为double。要获得float,您需要在末尾附加Ff。所以,改变一个给:

float f = 99.99f; 
+0

我有的另一个问题是java中的所有数据类型都是默认签名的。例如,我们有关键字unsigned,例如'C'吗? – liv2hak

+1

@ liv2hak。没有Java 7没有无符号类型。但是我记得,Java 8将支持无符号类型。 –

0

这很简单。你需要做一个类型转换:

float f = 99.99f; 

float f = (float)99.99; // This is a type cast 

您正在尝试一个“大”数存储到短变。 short只能存储-32.768到32.767的值。

0

使用此代码

在你的代码试图更大的数据类型分配给较小的,这将在精度损失,这是不允许的,所以你需要一个明确的类型最终投

short s =(short)99789;对于float,你有两个操作

float f = 99.99f;

浮子F =(浮点)99.99;(因为十进制值是默认双)

public static void main(String args[]) { 
    byte b = 8; 
    long a = 1000011334; 
    int c = 76; 
    short s = (short) 99789; 

    float f = 99.99f; 
    double d = 99979.9879; 
    boolean bool = true; 
    char ch = 'y'; 

    System.out.println("b = " + b); 
    System.out.println("a = " + a); 
    System.out.println("c = " + c); 
    System.out.println("s = " + s); 
    System.out.println("f = " + f); 
    System.out.println("d = " + d); 
    System.out.println("bool = " + bool); 
    System.out.println("ch = " + ch); 
} 

只记得这些转化被允许,这将不会导致精度

损失
0
 `float f = 99.99;`  //need to include f at last or need to type cast; 

需要被

  float f = 99.99f; 
      or 
      float f = (float)99.99; 

     short s = 99789;  //exceeded the limit 

的限制应

短:短数据类型为16位有符号二进制补码整数。它的最小值为-32,768,最大值为32,767(含)。与字节一样,也适用相同的指导原则:在实际节省内存的情况下,可以使用short来节省大型数组中的内存。

更多关于Java数据类型请参阅这里http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

0

short是一个16位的整数(无符号0-65535; -32768-32767签署)。您的s值太大,因此将其视为int

Java在默认情况下会将99.99视为双精度值。只需将f追加到该末尾(float f = 99.99f)即可解决该问题。

0
short s = 99789; 

短为16位值,而int是的32位 0.99789或任何数量的预定义Java中的INT。所以你必须手动投射你正在缩小数据类型。

short s = (short) 99789; 
+0

当我尝试'short s = 99789;'时,我得到一个错误“可能失去精度”,但是'short s = 9789;'编译得很好。我也使用Windows,并且我认为我从Oracle的网站下载了Java。但是*任何*'float f = nnn.nnn;'都会给我一个“可能丢失的precisin”的错误。 – ajb

+0

好吧,我查了一下:任何没有L的整数字面值都被当作int来处理。但是,如果值在范围内,编译器*会*自动将**常量**'int'值转换为'short'(或'byte'或'char')。但99789不是。 – ajb

+0

是的每个整数字面值默认情况下int和每个十进制数字是默认情况下双,如果你通过浮动引用双,猜猜怎么着?精度损失,因为double(更大)被float(小) –

0

的错误是在:

short s = 99789; 

“短” 的数据类型具有32767

99789> 32767的最大值,这将导致精度的损失。

而是尝试:

int s = 99789; 

同理:

float f = 99.99; 

应该是一个双:

double f = 99.99; 

希望帮助!