yamini nadella

Ranch Hand

Posts: 257

posted 13 years ago

Hi Friends,

(1)

public class ttest

{

public static void main(String args[])

{

final short s = 200;

byte b=(byte)s;

System.out.println("b "+b);

}

}

here b value is -56. how come this value comes like this.

I think -56 in binary is 1011 1000

binary value of 200 is 1100 1000, when it is assigned to byte it has to become -72

(2) how to assign a binary value to byte field. I tried

byte b = 1001

byte b = b1001

byte b = 1001b

I got compilation errors. for these all.

(3) in the same way when I print a byte by system.out.println then it is printing as decimal. is there any way to print as binary?

(4) Theoritiacally decimal 1 is 0000 0001 in binary. so -1 has to be

1000 0001. But it seems in practical it is 1111 1111 ???

Can some body help me.

Yamini_nadella@yahoo.com

(1)

public class ttest

{

public static void main(String args[])

{

final short s = 200;

byte b=(byte)s;

System.out.println("b "+b);

}

}

here b value is -56. how come this value comes like this.

I think -56 in binary is 1011 1000

binary value of 200 is 1100 1000, when it is assigned to byte it has to become -72

(2) how to assign a binary value to byte field. I tried

byte b = 1001

byte b = b1001

byte b = 1001b

I got compilation errors. for these all.

(3) in the same way when I print a byte by system.out.println then it is printing as decimal. is there any way to print as binary?

(4) Theoritiacally decimal 1 is 0000 0001 in binary. so -1 has to be

1000 0001. But it seems in practical it is 1111 1111 ???

Can some body help me.

Yamini_nadella@yahoo.com

Corey McGlone

Ranch Hand

Posts: 3271

posted 13 years ago

1. Read about 2's complement in your other post

2. From the JLS, §3.10.1 Integer Literals:

You can use Integer.parseInt(String s, int radix) to get around that.

3. Integer.toBinaryString

4. Read about 2's complement in your other post

Corey

2. From the JLS, §3.10.1 Integer Literals:

An integer literal may be expressed in decimal (base 10), hexadecimal (base 16), or octal (base 8)...

You can use Integer.parseInt(String s, int radix) to get around that.

3. Integer.toBinaryString

4. Read about 2's complement in your other post

Corey

yamini nadella

Ranch Hand

Posts: 257

Lionel Orellana

Ranch Hand

Posts: 87

posted 13 years ago

(4) Negative numbers in binary are not as easy as just putting a 1 in the sign bit. There's a nice little formula I find very helpful for this:

-X = ~X + 1 (sometimes shown as ~X = -X - 1 wich is useful when you want ~X)

If you want the decimal value of a negative binary like 1000 0001 you just:

invert all the bits -> 0111 1110 get the decimal value of 0111 1110 as normal -> 126 add 1 and put - infront -> -127

So what is 1111 1111?

invert -> 0000 0000

decimal -> 0

add 1 and put - -> -1!!

(1) With the formula this one's suddenly easy. 200 as a short is

0000 0000 1100 1000. When we cast it to byte we're left with 1100 1000, where the left most 1 means it's a negative number.

invert -> 0011 0111

decimal -> 55

add 1 put - infront -> -56

That's what b holds, -56.

Hope that helps

Cheers

L.

[ April 13, 2004: Message edited by: Lionel Orellana ]

[ April 13, 2004: Message edited by: Lionel Orellana ]

[ April 13, 2004: Message edited by: Lionel Orellana ]

[ April 13, 2004: Message edited by: Lionel Orellana ]

[ April 13, 2004: Message edited by: Lionel Orellana ]

(1)

here b value is -56. how come this value comes like this.

I think -56 in binary is 1011 1000

binary value of 200 is 1100 1000, when it is assigned to byte it has to become -72

(4) Theoritiacally decimal 1 is 0000 0001 in binary. so -1 has to be

1000 0001. But it seems in practical it is 1111 1111 ???

(4) Negative numbers in binary are not as easy as just putting a 1 in the sign bit. There's a nice little formula I find very helpful for this:

-X = ~X + 1 (sometimes shown as ~X = -X - 1 wich is useful when you want ~X)

If you want the decimal value of a negative binary like 1000 0001 you just:

So what is 1111 1111?

invert -> 0000 0000

decimal -> 0

add 1 and put - -> -1!!

(1) With the formula this one's suddenly easy. 200 as a short is

0000 0000 1100 1000. When we cast it to byte we're left with 1100 1000, where the left most 1 means it's a negative number.

invert -> 0011 0111

decimal -> 55

add 1 put - infront -> -56

That's what b holds, -56.

Hope that helps

Cheers

L.

[ April 13, 2004: Message edited by: Lionel Orellana ]

[ April 13, 2004: Message edited by: Lionel Orellana ]

[ April 13, 2004: Message edited by: Lionel Orellana ]

[ April 13, 2004: Message edited by: Lionel Orellana ]

[ April 13, 2004: Message edited by: Lionel Orellana ]

Corey McGlone

Ranch Hand

Posts: 3271

posted 13 years ago

Well, let's go through it, then.

200 in binary (as a 2 byte short) looks like this:

00000000 11001000

Now, if we cast that as a byte, we're going to truncate the most significant byte, which leave us with this:

11001000

the leftmost bit (the sign bit) is a 1, so we know that this is a negative number. Therefore, in order to determine what this value is, we must convert this from two's complement. To do that, we invert the bits and add 1.

00110111 - Inverted Bits

00111000 - Added 1

111000 in binary is equivalent to 56 in decimal.

I hope that helps,

Corey

Originally posted by yamini nadella:

now I understood 2's complement. But still I did not understand above issue(1).

Well, let's go through it, then.

200 in binary (as a 2 byte short) looks like this:

00000000 11001000

Now, if we cast that as a byte, we're going to truncate the most significant byte, which leave us with this:

11001000

the leftmost bit (the sign bit) is a 1, so we know that this is a negative number. Therefore, in order to determine what this value is, we must convert this from two's complement. To do that, we invert the bits and add 1.

00110111 - Inverted Bits

00111000 - Added 1

111000 in binary is equivalent to 56 in decimal.

I hope that helps,

Corey

It is sorta covered in the JavaRanch Style Guide. |