Unsigned char is 1 byte long..
it's range is from -128 to 127
Most significant bit is sign bit to indicate whether the char has positive or negative value and the rest 7 bits are meant for storing the actual value of char... so the max +ve value of char can be 127 as expected but in the -ve side how can it be -128 ???

0xFF is the largest value that can be stored in one byte, for signed integers that is 0xFF/2, which is 127.5 (use a calculator if you must). Since you can put 0.5 in a byte, one side is 127 and the other is 128 so that 127+128 = 255 (0xFF).

limits.h contains the upper and lower limits of all numeric data types supported by your compiler.

The reason that it's -128 and 127 breaks down like this: You have 8 bits. One of them is for sign. That leaves 7 bits for the value, or 128 values. One side is 0 to 127. Since you already have 0, the other half is -1 to -128.

Thanks for ur reply but there are actually 256 values 127 +128+one zero is also there.....and one more thing I can't understand 7 bits (1111111) can contain maximum of 127 so then how value 0f -128 is stored..

Read up on how Two's Complement works and hopefully you'll see. It comes down to 0 being counted as a positive number, and 1-127+0 is a total of 128 numbers; there's an equal number of negatives, but since it doesn't include 0, you get 1-128.

Unsigned char is 1 byte long..
it's range is from -128 to 127

At least; it can be larger.

Most significant bit is sign bit to indicate whether the char has positive or negative value and the rest 7 bits are meant for storing the actual value of char... so the max +ve value of char can be 127 as expected but in the -ve side how can it be -128 ???

Two's complement?

Unsigned char is 1 byte long..
it's range is from -128 to 127

Just noticed... an unsigned char has values 0 to 255, and a signed char is -128 to 127.

That said, I seem to recall in some discussions that a char is strictly defined as a single byte (8 bits) by the standard but I'm not sure where to double check that...

Just noticed... an unsigned char has values 0 to 255, and a signed char is -128 to 127.

That said, I seem to recall in some discussions that a char is strictly defined as a single byte (8 bits) by the standard but I'm not sure where to double check that...

In C (and derivatives) a byte is not defined as 8 bits. ;)

>Byte is not defined as 8 bits then what is it defined as?
It's defined as whatever the implementation wants. The standard only specifies that sizeof ( char ) be 1, and at least 8 bits. That happens to be the most common definition of a byte, but systems other than your PC also support C and don't have the same definition.

I have never seen a byte defined by anything other than 8 bits, although I don't thinnk the c or c++ standards specify its size. Here is just one of many examples.

>Byte is not defined as 8 bits then what is it defined as?
It's defined as whatever the implementation wants. The standard only specifies that sizeof ( char ) be 1, and at least 8 bits. That happens to be the most common definition of a byte, but systems other than your PC also support C and don't have the same definition.

So if you had an architecture that was word addressed rather than byte addressed, it wouldn't be surprising for sizeof(char) to be 1, yet that it would be 32 bits? Or is it determined by the actual implementation of your C library?

>it wouldn't be surprising for sizeof(char) to be 1, yet that it would be 32 bits?
Sure, why not?

>Or is it determined by the actual implementation of your C library?
It's determined by the compiler, not the library. Internally, a compiler will typically match the hardware for performance reasons, and the library would be written to match the compiler.

Hi friend.
This is goutham from India.
Ur doubt is that why is char range -128 in the negative side.
The most significant bit is sign bit.
So the bits available for storing magnitude is 7.
If sign bit is 0,the number is positive and the magnitude is stored in conventional binary form.
If sign bit is 1,the number is negative and the magnitude is stored in two's complement form.
For example, +1 is stored as 00000001.
-1 is sored as 11111111.
-128 gets 10000000.

If u still cant get it reply me.
bye

I have never seen a byte defined by anything other than 8 bits, although I don't thinnk the c or c++ standards specify its size.

I have. They do: CHAR_BIT.

Here is just one of many examples.

I'll stick with the C and C++ definitions. 'Cuz I've been bitten where it can bite.

I have. They do: CHAR_BIT

No Dave, thats a macro, actual value of that macro is defined by the compiler.

.I'll stick with the C and C++ definitions. 'Cuz I've been bitten where it can bite.

Agree. When a program must know the number of bits in a byte then use the CHAR_BIT macro.

This article has been dead for over six months. Start a new discussion instead.