12592 is 0x3130. That suggests that your C compiler represents characters with ASCII and sets the values of multiple-character character constants in a straightforward way, as if each character were a digit in a base-256 numeral.
To initialize an element of value_numbers
with this value, the compiler must convert 12592 to a char
. If char
is unsigned, this is effectively done by taking just the low eight bits, which are 0x30 or 48, the code for '0'
. (Mathematically, the remainder modulo 256 is taken.) If char
is signed, the C standard requires the C implementation to define the result of converting the value (which may include signaling an exception instead of producing a value and continuing). Wrapping modulo 256 to a representable value is common.
Since your source code '10'
represents the value 12592, but the compiler was forced to store a different value in the array, it warns you.
Note that the actual character encoding is implementation dependent (0 is 48 in ASCII but not in EBCDIC).