File APIs for Java Developers
Manipulate DOC, XLS, PPT, PDF and many others from your application.
The moose likes Java in General and the fly likes 16 bit char ??? Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login
JavaRanch » Java Forums » Java » Java in General
Bookmark "16 bit char ???" Watch "16 bit char ???" New topic

16 bit char ???

Sam Doder
Ranch Hand

Joined: Feb 06, 2008
Posts: 204
In java the char data type is 16 bit's = 2 bytes.
In C the char data type is 8 bit's = 1 byte.

My problem is I am converting some C library structures into java classes.
And I need a java data type that is equivalent to C char data type.

C char data type is equal to an unsigned byte. However java only has signed byte not unsigned byte.

I am wondering since java byte size is between -128 to 127.
And I am getting error's/warning's when I do this in java

byte b = 0xff ; //out of range and when I cast possible lose of data
Sure I can do this (byte)0xff But what would this give me?
Another words does the cast lose any thing?

I need a data type that has size 0 to 255 like unsigned bytes = 8 bit char do.

The reason is I am coding a cd/dvd burning application and need to write the volume descriptors out to a file. Most of the volume descriptors are bytes. But I am unsure about if the signed or unsigned issue will play a role in making a correct iso file. My C library had used alot of char to represent the field's in the descriptor.

Like char c = 0xff ; could I just use byte c = (byte)0xff for java?
I am not sure even if the range is an issue. I would think that if
the byte 0xff is written out to the file regardless of what it represents
(i.e a negative or positive number wouldn't matter just the fact that it is the correct value and it takes up the correct amount of space)

It would be great if somebody could confirm this.
Rob Spoor

Joined: Oct 27, 2005
Posts: 20276

You are right that Java does not have any unsigned 8 bit types. In fact, there is only one unsigned type: char. But that's 16 bit as you already mentioned.

You can still use byte however. Any byte value between 0 and 127 will map perfectly to C unsigned char values between 0 and 127. Byte values between -128 and -1 will map perfectly to unsigned char values between 128 and 255. This because of how they are represented in binary.

Java byte -128 = 1000 0000 = C unsigned char 128
Java byte -1 = 1111 1111 = C unsigned char 255
Java byte 1 = 0000 0001 = C unsigned char 1
Java byte 127 = 0111 1111 = C unsigned char 127

So in the end, you can match them one on one perfectly. All you need to do is turn the Java byte into an int (or short) and add 256 (2^8) if you want to view them as unsigned values.
[ September 10, 2008: Message edited by: Rob Prime ]

How To Ask Questions How To Answer Questions
Sam Doder
Ranch Hand

Joined: Feb 06, 2008
Posts: 204
This what I thought.
But why do we have signed or unsigned types. Are they just for convince.
Because 0xff = -1 (signed) = 255 (unsigned)

But we could always do the convertion

To get the number value for the corosponding unsigned byte.
Except now it is not a byte size but in this case we have the byte value and i is just what the value of the byte unsigned would be.

So why in some languages such as C/C++ do they give you the option of signed or unsigned data types is this just for convinence.
Because I would think you could always convert to get the corosponding value like above.

When I read/write the bytes out to a file I am wondering what classes I should use to make it correctly work. Should I use BufferedInputStream , FileInputStream,...etc etc which one or does it even matter provided I use
the equivalent readByte writeByte method? For performance which is the best?

Thanks for your help.
I agree. Here's the link:
subject: 16 bit char ???
It's not a secret anymore!