Why doesn't GCC produce a warning when assigning a signed literal to an unsigned type? Why doesn't GCC produce a warning when assigning a signed literal to an unsigned type? c c

Why doesn't GCC produce a warning when assigning a signed literal to an unsigned type?


Use -Wconversion:

~/src> gcc -Wconversion -Werror -Wall -Wextra -pedantic -o signwarn signwarn.ccc1: warnings being treated as errorssignwarn.c: In function 'main':signwarn.c:5: error: negative integer implicitly converted to unsigned type

I guess the thing here is that gcc is actually pretty good at generating warnings, but it defaults to not doing so for (sometimes unexpected) cases. It's a good idea to browse through the available warnings and choose a set of options that generate those you feel would help. Or just all of them, and polish that code until it shines! :)


The ability to convert negative value to unsigned type is a feature of C language. For this reason, the warning is not issued by default. You have to request it explicitly, if you so desire.

As for what your program outputs... Using %d format specifier of printf with an unsigned value that lies beyond the range of type int results in undefined behavior, which is what you really observed in your experiment.


Using (unsigned)-1 is an often used way to set all bits and sometimes even quoted as reason for this (mis)feature of C, even by people who should know better. It's neither obvious nor portable -- the expression you want to use to set all bits is ~0 .