aspose file tools*
The moose likes Beginning Java and the fly likes unsigned int Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login


Win a copy of The Java EE 7 Tutorial Volume 1 or Volume 2 this week in the Java EE forum
or jQuery UI in Action in the JavaScript forum!
JavaRanch » Java Forums » Java » Beginning Java
Bookmark "unsigned int" Watch "unsigned int" New topic
Author

unsigned int

Joseph Sweet
Ranch Hand

Joined: Jan 29, 2005
Posts: 327
I saw this piece of code in a tutorial:



However, Java has no unsigned int (yet). So what does it mean "Char acts as unsigned integer in arithmetic operations"?

Thanks.


We must know, we will know. -- David Hilbert
marc weber
Sheriff

Joined: Aug 31, 2004
Posts: 11343

A char holds a numeric value that represents a character symbol. The numeric value of a 16-bit char is always positive (so its range is from 0 through 2^16 - 1). In arithmetic operations, char values are widened to (at least) type int. Therefore, in an arithmetic operation, a char acts as a positive int (although its positive range is less than that of an int, which has a maximum value of 2^31 - 1).


"We're kind of on the level of crossword puzzle writers... And no one ever goes to them and gives them an award." ~Joe Strummer
sscce.org
Joseph Sweet
Ranch Hand

Joined: Jan 29, 2005
Posts: 327
Sounds strange. According to what you say, within an arithmetic operation, the char is automatically cast to an "unsigned" int which its positive range is LARGER than a regular ("signed") int's (2^32 - 1 vs. 2^31 - 1).
marc weber
Sheriff

Joined: Aug 31, 2004
Posts: 11343

Originally posted by Joseph Sweet:
Sounds strange. According to what you say, within an arithmetic operation, the char is automatically cast to an "unsigned" int which its positive range is LARGER than a regular ("signed") int's (2^32 - 1 vs. 2^31 - 1).

Not quite. The unsigned char value (16 bits) is widened to a signed int value (32 bits).

The char's unsigned value in the range of 0 through 2^16 - 1 fits easily into the signed int's range of -2^31 through 2^31 - 1. But there is never actually an unsigned int, nor a value that would exceed the signed int's maximum.

Does that make sense?
Joseph Sweet
Ranch Hand

Joined: Jan 29, 2005
Posts: 327
Ok, I think I got it, but in your previous reply you said

Therefore, in an arithmetic operation, a char acts as a positive int


Well it was a somewhat ambiguous statement. After the conversion (adding two zero MS bytes), it starts as a positive int, but it does not "act" as a positive int. The arithmetic operation can result in a negative int.

Ok. That was strange of them to present char arithmetic as a special case, since they have already presented earlier the general rules which are:



The Java VM specification states the following rules for promotion in an expression of two operands, as in x+i:

*
If either operand is of type double, the other is converted to double.
*
Otherwise, if either operand is of type float, the other is converted to float.
*
Otherwise, if either operand is of type long, the other is converted to long.
*
Otherwise, both operands are converted to type int.



Which answers my original question pretty well. So same rule applies to short, byte.... right?

As for boolean arithmetic, I don't know. I am not sure how they are represented in memory.
Campbell Ritchie
Sheriff

Joined: Oct 13, 2005
Posts: 38412
    
  23
Number arithmetic is number arithmetic and Boolean arithmetic is Boolean arithmetic and ne'er the twain shall meet. Only it is better to say "Boolean algebra."
Unlike in C where you can say if (c = 1) d = 2; else d = 3; thereby getting yourself three errors for the price of one, you cannot mix Boolean values and numbers. There is no use of 1 = true and 0 = false. The only vague approach to it I have ever seen in Java is that the %b flag prints "true" for any non-null value and "false" for nulls.
Joseph Sweet
Ranch Hand

Joined: Jan 29, 2005
Posts: 327
booleans are officially 1 bit, but I guess they are implemented as 1 byte. Why can't I do then:



Also, the rule that I cited above seems to apply then only to number, where chars and bytes are also considered as numbers for that matter.
[ July 07, 2007: Message edited by: Joseph Sweet ]
Campbell Ritchie
Sheriff

Joined: Oct 13, 2005
Posts: 38412
    
  23
They keep quiet about how booleans are stored, but the Byte Code Engineering Library suggest that booleans are manipulated as integers, and 1 and 0 bits are pushed onto the stack for booleans values. And the BitSet class uses 1 bit per boolean value.

Apart from that, one just has to guess how booleans values are stored.
 
I agree. Here's the link: http://aspose.com/file-tools
 
subject: unsigned int