main()
{
char i=255;
printf("\n%x\n",i);
}
output: ffffffff
main()
{
u_char i=255;
printf("\n%x\n",i);
}
output: ff
What is happening here? Kindly explain the output to me with some good links. This is a very basic thing I guess and I am getting really confused...
What you are seeing here is caused by two things:
255
does not fit in the range of char
(note that it is implementation-defined whether char
is equivalent to signed char
or unsigned char
, but evidently on your platform it is signed char
). The resulting behaviour is implementation-defined, but typically it will wrap round and become -1; see two's complement . printf()
is a variable-argument function . Integral-type arguments (like char
) are automatically promoted to int
. So printf()
sees an int
with a value of -1
, and prints its hexadecimal representation accordingly.
For the unsigned
case, there is no wrap-around. printf()
sees an int
with a value of 255
, and prints its hexadecimal representation accordingly (omitting the leading zeros).
The C compiler has to expand the value passed to printf
(this is called "promotion"), because printf
is a variadic function (it can be called with differing arguments). For values of type char
, the promoted value is of type int
. Since your compiler's char
type seems to be signed, the promoted value is sign extended. In binary:
char i = 255 // or: 11111111 in binary
int promoted_i = -1 // or: 11....11111 (usually, 32 or 64 ones)
In the unsigned case, no sign-extension happens:
char u = 255 // or: 11111111 in binary, same as above but with different interpretation
unsigned int pu = i // or: 00....0011111111 (8 ones, preceded by the appropriate number of zeroes)
char i = 255;
invokes implementation-defined behavior by converting a value to a signed type into which it does not fit (assuming char
is only 8 bits and plain char
is signed, both of which are also implementation-specific.
当你将一个8位有符号变量设置为它不能容纳的值255时,在这种情况下它似乎将负(高端)标志设置为1,因此如果它被签名则该值为-1 ,然后它被转换为整数-1,即ffffffff
。
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.