I don't think that an error needs to be thrown, as it will just overflow and wrap around. My concern is that using %c may or may not throw a sign bit into the encoded value. That requires the recipient of that value to know whether the value was negative ahead of time.
No, but he needs to know whether to interpret the MSB is a sign bit or not (or expressed differently, whether to sign-extend or zero-extend the value after decoding it). But he also need to know how many octets to decode, how is this any different? %1c can be used to encode either the range 0..255 or the range -128..127, and you need to decide which one to use when you specify the binary format you are encoding into, just like you need to decide whether to use 1, 2 or 17 octets to encode the number. If you use a number outside of the selected range, sscanf will truncate it. If you choose the range 0..255 (%1c), 270 will be truncated to 14 and -3 will be truncated to 253. If you choose the range -128..127 (%1c for encode, and %+1c for decode), 130 will be truncated to -126 and -200 to 56. sprintf will not check that the value is in the chosen range, that's up to you.
sprintf %Nc will never "throw a sign bit in", it will simply encode the N*8 least significant bits of the 2-complement binary representation of the integer. This is true whether or not the number is negative.