/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Besynderlig switch med hex literal
Fra : Casper


Dato : 28-06-05 14:13

Hvorfor må man ikke switche på en hex byte literal i Java? Det må man i
alle andre sprog og andre steder i Java syntaksen som f.eks. en "if...":

byte value = ...
switch(value)
{
case 0xef:   << Syntaks error
return true;
}

....men man må godt caste til en integer først og dernæst til byte:

byte value = ...
switch(value)
{
case (byte)(int)0xef:
return true;
}

Virker da som en designfejl i Java. Som om en hex værdi i Java er tæt
knyttet til en integer, og ikke bare en laverestående/abstrakt literal
hvor basen (2,8,10,16...) er ligegyldig.

Casper

 
 
Thorbjoern Ravn Ande~ (28-06-2005)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 28-06-05 14:26

Casper <casper@jbr.dk> writes:

> Hvorfor må man ikke switche på en hex byte literal i Java? Det må man
> i alle andre sprog og andre steder i Java syntaksen som f.eks. en
> "if...":

Bytes i Java løber fra -127 til 127 (cirka). 0xef er ikke en gyldig
byteværdi i Java.

Hvad præcis var fejlmeddelelsen?

--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk/ravn/

Casper (29-06-2005)
Kommentar
Fra : Casper


Dato : 29-06-05 10:02

> Bytes i Java løber fra -127 til 127 (cirka). 0xef er ikke en gyldig
> byteværdi i Java.

Så bytes er signed? Det var da et besynderligt udgangspunkt for en byte.
Så skal man jo nærmest lave noget "(int) 0xef & 0xFF" for at konvertere
korrekt til en værdi man tester cases imod i en switch?

> Hvad præcis var fejlmeddelelsen?

Constant '0xef' is wider than type 'byte'

Thorbjoern Ravn Ande~ (29-06-2005)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 29-06-05 10:22

Casper <casper@jbr.dk> writes:

> Så bytes er signed? Det var da et besynderligt udgangspunkt for en
> byte. Så skal man jo nærmest lave noget "(int) 0xef & 0xFF" for at
> konvertere korrekt til en værdi man tester cases imod i en switch?

Ja. Switchindgangene er int's (char er kompatibel med int).

> > Hvad præcis var fejlmeddelelsen?
>
> Constant '0xef' is wider than type 'byte'

Dvs den ville ikke kunne tildeles til din value-variabel, og er derfor
et ugyldigt argument. Det er da rart at vide.

Du er bare blevet snydt af at Java ligner C i syntaksen. Tillad mig
at anbefale dig at læse et "Java for C programmører" dokument - find
selv en på GOogle.

--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk/ravn/

Lasse Reichstein Nie~ (28-06-2005)
Kommentar
Fra : Lasse Reichstein Nie~


Dato : 28-06-05 18:22

Casper <casper@jbr.dk> writes:

> Hvorfor må man ikke switche på en hex byte literal i Java?

Det må man skam også, bare man opfører sig ordentligt :)

> byte value = ...
> switch(value)
> {
> case 0xef:   << Syntaks error
> return true;
> }
>
> ...men man må godt caste til en integer først og dernæst til byte:
....
> case (byte)(int)0xef:
....

Du behøver skam ikke cast'e til int første. En heltals-literal er
altid en integer med mindre andet er angivet (suffix L for long, F for
float, D for double, e.g., 0xdeadbeefbabe0123L, 42F)

Der er ikke nogen suffixer for mindre typer end int (byte, short,
char). Til gengæld vil int-literals automatisk blive omformet til den
passende type *hvis* tallet kan være i den. Som Thorbjørn pointerede,
så er din konstant for stor til at være i en byte.

> Virker da som en designfejl i Java. Som om en hex værdi i Java er tæt
> knyttet til en integer, og ikke bare en laverestående/abstrakt literal
> hvor basen (2,8,10,16...) er ligegyldig.

Det er alle heltalstalkonstanter, og så er der regler for hvornår
compileren må lave dem om til mindre typer.

/L 'kan stadig huske *lidt* af min "Java Programmer"'
--
Lasse Reichstein Nielsen - lrn@hotpop.com
DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleDOM.html>
'Faith without judgement merely degrades the spirit divine.'

Søg
Reklame
Statistik
Spørgsmål : 177449
Tips : 31962
Nyheder : 719565
Indlæg : 6408120
Brugere : 218879

Månedens bedste
Årets bedste
Sidste års bedste