Avatar billede fredand Forsker
21. november 2003 - 15:56 Der er 11 kommentarer og
3 løsninger

Excplicit typecast?

Hello!

I was so sure that I would get a RuntimeException for the code below since the short value is to big to be represented by a byte. But I got "16" in the output if the short value was 10000 and "48" if the short value was 30000.

Can any one explain what the rule is for Java to decide what the value after the typecast in the byte will be?

Best Regards
Fredrik

public class Test
{
    public static void main(String[] args)
    {
        short myShort = 30000;
        byte myByte = (byte)myShort;
        System.out.println(myByte);
    }
}
Avatar billede jakoba Nybegynder
21. november 2003 - 16:03 #1
Den generelle regel er at når du udtrykkeligt fortæller java at den skal caste fx en int til en byte, så er det på dit eget ansvar hvis der går noget tilspilde.

det er kun hvis du fx siger
  byte b = 127;
  b += b;
at du kan forvente en exception.

mvh JakobA
Avatar billede _carsten Nybegynder
21. november 2003 - 16:05 #2
The largest value for short is 32767, so change it 32768 and you will get a RuntimeException
Avatar billede _carsten Nybegynder
21. november 2003 - 16:11 #3
Correction - you won't be able to compile
Avatar billede arne_v Ekspert
21. november 2003 - 16:17 #4
Java just make a simple truncate.

10000 = 0x2710    0x10 = 16

30000 = 0x7530    0x30 = 48

You can simulate it by doing:
  & 0xFF
(at least if the result is positive)
Avatar billede jakoba Nybegynder
21. november 2003 - 16:30 #5
en lille sjov en:
        short myShort = 128;
        byte myByte = (byte)myShort;
        System.out.println(myByte);    //skriver -128
Avatar billede fredand Forsker
21. november 2003 - 16:57 #6
Hello!
Thanks for the replies but:
1) why will it be -128???? It should be 128!!
2)Is there som place where I can read more abouts truncate.

BTW
Give answers so you can get your share of the points

Best regards
Fredrik
Avatar billede arne_v Ekspert
21. november 2003 - 17:03 #7
short 128 = 0x80 = byte -128

a byte has a range of -128 .. 127 and can not contain 128
Avatar billede arne_v Ekspert
21. november 2003 - 17:05 #8
byte = 1 byte
short = 2 bytes
int = 4 bytes¨
long = 8 bytes

when assigning from a bigger to a smaller types the bytes that can
not be there are just truncated off.

When you write the numbers in hex you can see the bytes and can
easily see how it works.
Avatar billede arne_v Ekspert
21. november 2003 - 17:06 #9
Rather obvious.

At least when you started with assembler programming.
Avatar billede jakoba Nybegynder
21. november 2003 - 17:07 #10
fordi de primitive typer defines i bit.

en byte er 8 bit.
en shoret er 16 bit
en int er 32 bit
en long er 64 bit
og de er alle 'signed', dvs at den 'øverste' bit er fortegn

00000000 10000000
s                    fortegnsbit er 0 så dette tal (short) er positivt
          1            2^7 bit er 1  så 128

          10000000
          s          fortegnsbit er 1 så dette tal (byte) er negativt
                      og så skal vi snakke om 1-complement representation for at forstå at talværdien er 128. den er lidt komplex, men prøv selv hvor mange gange du kan lægge 00000001 til før du får et 00000000

mvh JakobA
Avatar billede arne_v Ekspert
21. november 2003 - 17:11 #11
2's complement
Avatar billede jakoba Nybegynder
21. november 2003 - 17:12 #12
byte my shorts ? :-))
Avatar billede jakoba Nybegynder
21. november 2003 - 17:14 #13
Undskyld, arne her ret. det er 2-komplement.
Avatar billede fredand Forsker
27. november 2003 - 12:05 #14
Thanks mates!
/Fredrik
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester