In C/C++, what an unsigned char
is used for? How is it different from a regular char
?
相关问题
- Sorting 3 numbers without branching [closed]
- Multiple sockets for clients to connect to
- How to compile C++ code in GDB?
- Why does const allow implicit conversion of refere
- thread_local variables initialization
In C++, there are three distinct character types:
char
signed char
unsigned char
If you are using character types for text, use the unqualified
char
:'a'
or'0'
."abcde"
It also works out as a number value, but it is unspecified whether that value is treated as signed or unsigned. Beware character comparisons through inequalities - although if you limit yourself to ASCII (0-127) you're just about safe.
If you are using character types as numbers, use:
signed char
, which gives you at least the -127 to 127 range. (-128 to 127 is common)unsigned char
, which gives you at least the 0 to 255 range."At least", because the C++ standard only gives the minimum range of values that each numeric type is required to cover.
sizeof (char)
is required to be 1 (i.e. one byte), but a byte could in theory be for example 32 bits.sizeof
would still be report its size as1
- meaning that you could havesizeof (char) == sizeof (long) == 1
.In terms of direct values a regular char is used when the values are known to be between
CHAR_MIN
andCHAR_MAX
while an unsigned char provides double the range on the positive end. For example, ifCHAR_BIT
is 8, the range of regularchar
is only guaranteed to be [0, 127] (because it can be signed or unsigned) whileunsigned char
will be [0, 255] andsigned char
will be [-127, 127].In terms of what it's used for, the standards allow objects of POD (plain old data) to be directly converted to an array of unsigned char. This allows you to examine the representation and bit patterns of the object. The same guarantee of safe type punning doesn't exist for char or signed char.
char
andunsigned char
aren't guaranteed to be 8-bit types on all platforms—they are guaranteed to be 8-bit or larger. Some platforms have 9-bit, 32-bit, or 64-bit bytes. However, the most common platforms today (Windows, Mac, Linux x86, etc.) have 8-bit bytes.This is implementation dependent, as the C standard does NOT define the signed-ness of
char
. Depending on the platform, char may besigned
orunsigned
, so you need to explicitly ask forsigned char
orunsigned char
if your implementation depends on it. Just usechar
if you intend to represent characters from strings, as this will match what your platform puts in the string.The difference between
signed char
andunsigned char
is as you'd expect. On most platforms,signed char
will be an 8-bit two's complement number ranging from-128
to127
, andunsigned char
will be an 8-bit unsigned integer (0
to255
). Note the standard does NOT require thatchar
types have 8 bits, only thatsizeof(char)
return1
. You can get at the number of bits in a char withCHAR_BIT
inlimits.h
. There are few if any platforms today where this will be something other than8
, though.There is a nice summary of this issue here.
As others have mentioned since I posted this, you're better off using
int8_t
anduint8_t
if you really want to represent small integers.An unsigned char is a (unsigned) byte value (0 to 255). You may be thinking of "char" in terms of being a "character" but it is really a numerical value. The regular "char" is signed, so you have 128 values, and these values map to characters using ASCII encoding. But in either case, what you are storing in memory is a byte value.
Some googling found this, where people had a discussion about this.
An unsigned char is basically a single byte. So, you would use this if you need one byte of data (for example, maybe you want to use it to set flags on and off to be passed to a function, as is often done in the Windows API).