Sriram Sharma

Ranch Hand

Posts: 134

posted 10 years ago

Hi All,

I have a small doubt on the max value that a short(data type) variable can take.

Short can accomodate 16 bits, of which the left most bit is a sign bit and the remaining 15 bits represent value.

So the max value that can be accomodated by the short variable is (2^15-1).

(^ represents the power symbol).

Does Java allow us to manipulate the short variable such that it takes the left most bit as a value bit instead of sign bit?

I have a small doubt on the max value that a short(data type) variable can take.

Short can accomodate 16 bits, of which the left most bit is a sign bit and the remaining 15 bits represent value.

So the max value that can be accomodated by the short variable is (2^15-1).

(^ represents the power symbol).

Does Java allow us to manipulate the short variable such that it takes the left most bit as a value bit instead of sign bit?

Rusty Shackleford

Ranch Hand

Posts: 490

posted 10 years ago

The only unsigned primitive type in Java is char. Since a char is an integral value(number), you can use that to store un unsigned short value. It would get tedious to keep having to convert to short/int and then back again for arithmetic operations. Probably not worth the hassle.

[ June 16, 2006: Message edited by: Rusty Shackleford ]

[ June 16, 2006: Message edited by: Rusty Shackleford ]

"Computer science is no more about computers than astronomy is about telescopes" - Edsger Dijkstra

Campbell Ritchie

Sheriff

Posts: 53779

128

posted 10 years ago

But Java doesn't use sign bits in integers numbers. Sign bits are used in S+M formats, and Java uses two's complement. Contrary to what it says in the Wikipedia article, the MSB (= most significant bit, or leftmosr bit) is a value bit. It is easiest to understand in a byte, because it only has eight bits, numbered from 0 on the right (LSB = least significant bit) to 7 on the left.

This is not the correct definition for two's complement but it works.

Bit 0: 2^0 = 1. Bit 1: 2^1 = 2 Bit2: 2^2 = 4. Bit 3: 2^3 = 8 Bit 4: We are now in the left half of the byte: 2^4 = 16 Bit 5: 2^5 = 32 Bit 6: 2^6 = 64. Bit 7: MINUS 2^7 = MINUS 128.

Now you just add all the values of the bits together. You find that the MSB is always 1 in negative numbers and 0 in zero or positive numbers, but it is not simply a sign; it has a value of its own.

If you go into the API and find a wrapper class for an integer value (eg Short), and find its field called MIN_VALUE and click on that and then click on the link to constant field values, you will find the values, eg in a Short -32768. That is in the case of a short (or Short) 2^15, a figure which is quoted in the class description.

The correct way to work out a number in two's complement is like this:-Take a number, eg 13. Work it out in binary, eg 1101. Give it enough digits to fit into the appropriate number of bytes. Let's stick to eight to make it easier. 0000_1101 Invert every digit. That give's you its one's complement, but you hardly ever use one's complement. 0000_1101->1111_0010. Add 1 (or 0000_0001). 1111_0010 becomes 1111_0011. Finished. .

Now if you add -128 + 64 + 32 + 16 + (0*8=0) + (0*4=0) + 2 + 1, you get -13.

Or, if you work out the two's complement of -13 (1111_0011), you get 0000_1101, which is +13.

Can you change the way Java manipulates the bit values? NO.

This is not the correct definition for two's complement but it works.

Now you just add all the values of the bits together. You find that the MSB is always 1 in negative numbers and 0 in zero or positive numbers, but it is not simply a sign; it has a value of its own.

If you go into the API and find a wrapper class for an integer value (eg Short), and find its field called MIN_VALUE and click on that and then click on the link to constant field values, you will find the values, eg in a Short -32768. That is in the case of a short (or Short) 2^15, a figure which is quoted in the class description.

The correct way to work out a number in two's complement is like this:-

Now if you add -128 + 64 + 32 + 16 + (0*8=0) + (0*4=0) + 2 + 1, you get -13.

Or, if you work out the two's complement of -13 (1111_0011), you get 0000_1101, which is +13.

Can you change the way Java manipulates the bit values? NO.

Campbell Ritchie

Sheriff

Posts: 53779

128

posted 10 years ago

The remainder of the Wikipedia article here appears accurate, apart from calling teh MSB a sign bit when it has a value of its own.

Rusty Shackleford

Ranch Hand

Posts: 490

posted 10 years ago

In 2's complement the MSB is the sign bit and this is what java uses. From the JLS:

The integral types are byte, short, int, and long, whose values are 8-bit, 16-bit, 32-bit and 64-bit signed two's-complement integers, respectively, and char, whose values are 16-bit unsigned integers representing UTF-16 code units

Then:

# For byte, from -128 to 127, inclusive

# For short, from -32768 to 32767, inclusive

# For int, from -2147483648 to 2147483647, inclusive

# For long, from -9223372036854775808 to 9223372036854775807, inclusive

# For char, from '\u0000' to '\uffff' inclusive, that is, from 0 to 65535

So the MSB(or at least one of the bits, most likely MSB) is the sign bit.

The integral types are byte, short, int, and long, whose values are 8-bit, 16-bit, 32-bit and 64-bit signed two's-complement integers, respectively, and char, whose values are 16-bit unsigned integers representing UTF-16 code units

Then:

# For byte, from -128 to 127, inclusive

# For short, from -32768 to 32767, inclusive

# For int, from -2147483648 to 2147483647, inclusive

# For long, from -9223372036854775808 to 9223372036854775807, inclusive

# For char, from '\u0000' to '\uffff' inclusive, that is, from 0 to 65535

So the MSB(or at least one of the bits, most likely MSB) is the sign bit.

"Computer science is no more about computers than astronomy is about telescopes" - Edsger Dijkstra

Stan James

(instanceof Sidekick)

Ranch Hand

Ranch Hand

Posts: 8791

posted 10 years ago

Is it only a true "sign bit" if

+1 = 00000001

-1 = 10000001

I've used numbers where the only difference between a positive n and negative n is the high order bit. Or was it nibble. The positive and negative range is the same, and negative 0 does not equal positive 0.

In 2s complement the high order bit does indeed indicate a positive or negative number, but it's far from the only difference.

Does that sound right?

+1 = 00000001

-1 = 10000001

I've used numbers where the only difference between a positive n and negative n is the high order bit. Or was it nibble. The positive and negative range is the same, and negative 0 does not equal positive 0.

In 2s complement the high order bit does indeed indicate a positive or negative number, but it's far from the only difference.

Does that sound right?

A good question is never answered. It is not a bolt to be tightened into place but a seed to be planted and to bear more seed toward the hope of greening the landscape of the idea. John Ciardi

Rusty Shackleford

Ranch Hand

Posts: 490

posted 10 years ago

"Is it only a true "sign bit" if

+1 = 00000001

-1 = 10000001"

Signed magnitude uses that, but is not commonly found in processors, also BCD(binary coded decimal) might utilize that, not sure. 2's complement uses a "true" sign bit, just like grey code uses a parity bit. That particular bit(MSB) is used for only one thing, sign.

Signed 2's compliment flips each bit(this is called signed 1's compliment) then adds one, except for the MSB. That remains unchanged.

+1 = 00000001

-1 = 10000001"

Signed magnitude uses that, but is not commonly found in processors, also BCD(binary coded decimal) might utilize that, not sure. 2's complement uses a "true" sign bit, just like grey code uses a parity bit. That particular bit(MSB) is used for only one thing, sign.

Signed 2's compliment flips each bit(this is called signed 1's compliment) then adds one, except for the MSB. That remains unchanged.

"Computer science is no more about computers than astronomy is about telescopes" - Edsger Dijkstra

Campbell Ritchie

Sheriff

Posts: 53779

128

Campbell Ritchie

Sheriff

Posts: 53779

128

posted 10 years ago

Using a byte (-2^7 = -128 to 0 to 2^7-1 = 127) because it is easier:-

-128 = 1000_0000

one's complement = 0111_1111

Add 0000_0001:-

0111_1111

0000_0001

1000_0000, which is why you call it a weird number; it has reverted to its original value.

No, when you flip your bits, and add 1 the MSB might change. If the MSB is fixed, then you are talking about S+M. There is one instance where the MSB would change in two's complement (what they call a weird number in the Wikipedia article quoted):-the MSB . . . remains unchanged.

Using a byte (-2^7 = -128 to 0 to 2^7-1 = 127) because it is easier:-

-128 = 1000_0000

one's complement = 0111_1111

Add 0000_0001:-

0111_1111

0000_0001

1000_0000, which is why you call it a weird number; it has reverted to its original value.

Rusty Shackleford

Ranch Hand

Posts: 490

posted 10 years ago

in signed 2's complement the sign bit stays the same. MSB is used for only one thing in signed binary number, sign. One bit for sign, the rest for the value. In unsigned 2's complement, it can and usually will change.

Here are 3 representations of -9 in 8 bits to keep it simple:

Signed magnitude: 10001001

signed 1's: 11110110

signed 2's: 11110111

What is the one thing that does not change? This extends to all negative numbers, the only thing the same is the MSB is always 1. Ditto for positive, except the MSB is 0

Note there is a difference between signed and unsigned 2's complement.

Here are 3 representations of -9 in 8 bits to keep it simple:

Signed magnitude: 10001001

signed 1's: 11110110

signed 2's: 11110111

What is the one thing that does not change? This extends to all negative numbers, the only thing the same is the MSB is always 1. Ditto for positive, except the MSB is 0

Note there is a difference between signed and unsigned 2's complement.

"Computer science is no more about computers than astronomy is about telescopes" - Edsger Dijkstra

Campbell Ritchie

Sheriff

Posts: 53779

128

posted 10 years ago

Rusty, are you sure? As far as I can remember, there is only one sort of two's complement number, which is signed.

Try this number, is S+M:

0101_0101. It should come to 55hex = 85dec. In two's complement it comes to 55hex = 85dec.

Now try this number in S+M:

1101_0101. In S+M the only change is the MSB, which represents sign. So it comes to -55hex = -85dec. But if you try

. . . it most certainly won't come to -85. Try it. I won't tell you the answer.

Stan James is quite right to say

I think we agree on what we think a two's complement number is, just disagreeing about what you call its bits.

Try this number, is S+M:

0101_0101. It should come to 55hex = 85dec. In two's complement it comes to 55hex = 85dec.

Now try this number in S+M:

1101_0101. In S+M the only change is the MSB, which represents sign. So it comes to -55hex = -85dec. But if you try

. . . it most certainly won't come to -85. Try it. I won't tell you the answer.

Stan James is quite right to say

Even though the MSB in a two's complement number is always 1 when the number is negative and 0 if the number is not negative (including zero), it does not follow the definition he gives of a sign bit. The value of a two's complement negative number is not (minus) itsIs it only a true "sign bit" if

+1 = 00000001

-1 = 10000001

*n*-1 all-except-most-significant bits.I think we agree on what we think a two's complement number is, just disagreeing about what you call its bits.

Campbell Ritchie

Sheriff

Posts: 53779

128

Rusty Shackleford

Ranch Hand

Posts: 490

posted 10 years ago

There is signed and unsigned 2's complement, although signed is far more common.

Of course the signed magnitude of a negative number is not the same as 2's complement, it is different for positive numbers as well. You can not compare SM and 2's. You can not just add a 1 in the MSB to convert from positive to negative, I never said that.

+7 is 2's: 0111, if you just change the sign bit, you get -1, and that makes sense, because how 2's is derived. What that does not mean is that the MSB is used for multiple meanings nor that other bits have special significance.

Take the SM of -1: turn it into 2's: 1111. What I was saying is that MSB in signed 2's is used only for sign, nothing else. It is a sign bit. There is no binary code that I am aware of that a bit is used for different things in the same context, that leads to ambiguity. That doesn't mean that simply changing the MSB gives you the opposite value. That happens in SM, not 2's.

Of course the signed magnitude of a negative number is not the same as 2's complement, it is different for positive numbers as well. You can not compare SM and 2's. You can not just add a 1 in the MSB to convert from positive to negative, I never said that.

+7 is 2's: 0111, if you just change the sign bit, you get -1, and that makes sense, because how 2's is derived. What that does not mean is that the MSB is used for multiple meanings nor that other bits have special significance.

Take the SM of -1: turn it into 2's: 1111. What I was saying is that MSB in signed 2's is used only for sign, nothing else. It is a sign bit. There is no binary code that I am aware of that a bit is used for different things in the same context, that leads to ambiguity. That doesn't mean that simply changing the MSB gives you the opposite value. That happens in SM, not 2's.

"Computer science is no more about computers than astronomy is about telescopes" - Edsger Dijkstra

It is sorta covered in the JavaRanch Style Guide. |