2013-10-06 3 views
0

J'ai écrit mon tout premier programme java sur eclipse sous Windows. J'ai récemment commencé à programmer java sur linux.java: conversion de type simple

Lorsque j'essaie de compiler le programme ci-dessus sous Linux, cela fonctionne très bien mais lorsque j'essaie de le faire sous Windows, j'obtiens l'erreur suivante.

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

Si quoi que ce soit, il est tout à fait étrange que ce code compile sous Linux. Quel compilateur utilisez-vous? Est-ce vraiment le même code exact? – Dolda2000

Répondre

4

Lorsque je tente de compiler le programme ci-dessus sur Linux, il fonctionne très bien

C'est en fait assez surprenant, et je ne peux pas Achète-le. Vérifiez à nouveau, il ne devrait pas.

short est un entier à complément à 2 signé de 16 bits. Sa valeur maximale est 32767 et vous lui attribuez 99789. C'est définitivement hors gamme.Vous devez typecast explicitement à short:

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

Bien que vous y voir des résultats bizarres. Les bits supplémentaires seront tronqués. Il est préférable d'utiliser un int directement.

Maintenant, dans le cas de float, les littéraux en virgule flottante sont double par défaut. Pour obtenir float, vous devez ajouter un F ou f à la fin. Ainsi, modifier celui-là pour:

float f = 99.99f; 
+0

L'autre question que j'ai sont tous les types de données Java signé par default.Do nous avons le mot-clé non signé comme dans « C » par exemple? – liv2hak

+1

@ liv2hak. Non à partir de Java 7 il n'y a pas de type non signé. Mais si je me souviens, Java 8 aura un support pour les types non signés. –

0

C'est facile. Vous devez faire un casting de type:

float f = 99.99f; 

ou

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

Vous essayez de stocker un nombre « important » dans une variable courte. short ne peut stocker que des valeurs de -32.768 à 32.767.

0

Utilisez ce code

dans votre code que vous essayez d'attribuer plus grand type de données à plus petits, qui finira par la perte de précision, ce qui est pas autorisé si vous devez un type explicite jeté

courte s = (courte) 99789; et pour float vous avez deux opétions

float f = 99,99f;

ou

flotteur f = (float) 99,99; (parce que les valeurs décimales sont doubles par défaut)

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); 
} 

ne se souviennent que ces conversions sont autorisées qui ne se traduira pas par une perte de précision

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

besoin d'être

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

     short s = 99789;  //exceeded the limit 

La limite doit être

court: Le court type de données est un 16 bits signé deux entier de l'complément. Il a une valeur minimale de -32 768 et une valeur maximale de 32 767 (inclus). Comme pour les octets, les mêmes règles s'appliquent: vous pouvez utiliser un raccourci pour enregistrer de la mémoire dans de grands tableaux, dans des situations où l'économie de mémoire est importante.

Plus d'informations sur les types de données Java s'il vous plaît se référer ici http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

0

A short est un nombre entier de 16 bits (0-65535 non signé; -32768 à 32767 signé). Votre valeur pour s est trop grande, elle est donc traitée comme int à la place.

Java voit 99.99 comme un double par défaut. Ajoutez simplement f à la fin de ce (float f = 99.99f) pour résoudre ce problème.

0
short s = 99789; 

court est un 16 bits tandis que la valeur int est de 32 bits 0,99789 ou tout nombre est prédéfini un int en java. vous devez donc lancer manuellement vous rétrécissez les types de données.

short s = (short) 99789; 
+0

Lorsque je tente 's court = 99789;', je reçois une erreur "possible perte de précision", mais 's court = 9789;' compile bien. J'utilise aussi Windows, et je pense avoir téléchargé Java depuis le site d'Oracle. Mais * any * 'float f = nnn.nnn;' me donne une erreur de "perte de précision possible". – ajb

+0

OK, je l'ai cherché: Tout littéral entier sans L est traité comme un 'int'. Cependant, le compilateur * convertira automatiquement une valeur ** constante ** 'int' en' short' (ou 'byte' ou' char') si la valeur est dans la plage. Mais 99789 ne l'est pas. – ajb

+0

ouais chaque littéral entier est par défaut int et chaque nombre décimal est par défaut double et si vous faites référence à double via float, devinez quoi ?? Perte de précision car double (plus grand) a été référé par float (plus petit) –

0

L'erreur est en:

short s = 99789; 

Le type de données "court" a une valeur maximale de 32767

99789> 32767 qui se traduira par une perte de précision.

Essayez plutôt:

int s = 99789; 

De même:

float f = 99.99; 

devrait être double:

double f = 99.99; 

Hope qui aide!