Home > Software engineering >  printf flag '%u' on a 1byte variable treats it as 4bytes all ones
printf flag '%u' on a 1byte variable treats it as 4bytes all ones

Time:10-17

-1 in a 1byte variable is 1111 1111 now when I try to printf it as if It was an unsigned integer I expect it to be 255 but some how It's treating it as if It was 4bytes all containing ones saying "0xff ff ff ff" which is 2 to the 32 minus 1 . why is that? and why it assumes the remaining 3 bytes as all ones?

#include "stdio.h"
int main ( ) {
    char g = -1; 
    printf ( "g is %u \n" , g );

    return 0;
}

CodePudding user response:

For starters in your program the type char behaves as the type signed char.

In this call

printf ( "b is %u \n" , g );

the expression g of the type char is promoted to the type int due to the integer promotions preserving the sign bit. The value -1 in an object of the type int for 2s complement system is represented like 0xff ff ff ff provided that sizeof( int ) is equal to 4..

It will more correctly to write

printf ( "b is %u \n" , ( unsigned int )g );

To get the expected result you need to write

printf ( "b is %u \n" , ( unsigned char )g );

CodePudding user response:

When you use the %u specifier with printf you are telling it to expect an int, which on your system is apparently 32-bits. So, -1 as a 32-bit int on your system is represented by 0xffffffff.

It then prints this as an unsigned int, giving you the result you're seeing.

As mentioned in the comments, replace the %u specifier with %hhu to avoid the promotion of your 8-bit signed value into a 32-bit signed value.

For a list of C printf specifiers, see this page on cplusplus.com.

The %h specifier indicates a short int which is 16-bits. The %hh specifier indicates a short short int or just char which is a single byte.

  •  Tags:  
  • c
  • Related