У меня есть код, работающий в двух проектах / платформах. Он работает в одном, а не в другом. Код такой:
uint8_t val = 1;
uint8_t buff[16];
sprintf(buff, "%u", val);
Ожидаемый результат - «1» (gcc), но в одном компиляторе (Keil) он возвращает «511», что в шестнадцатеричном формате равно 0x1FF. Похоже, этот компилятор не продвигает байт в int. Это подтверждается, потому что все работает нормально, если я сделаю следующее:
sprintf(buff, "%u", (int)val);
У меня такой вопрос: почему один компилятор делает то, что я считаю «правильным», а другой - нет? Это мои неверные ожидания / предположения, настройка компилятора или что-то еще?
sprintf(buf,"%hhu",val);
, работает? - person Alex Lop.   schedule 18.09.2015val
находится в вариативной части списка аргументов и должен быть повышен доint
перед передачей. Я не думаю, что 0x1FF - правильный способ продвижения байта. - person Jonathan Leffler   schedule 18.09.2015uint8_t
должен быть повышен чисто доint
в вызове. Даже еслиint
является 16-битным типом, я не вижу возможности для0x1FF
быть допустимым продвижением значения1
. - person Jonathan Leffler   schedule 18.09.2015sprintf(buff, "%u", (int)val);
. Это, конечно, ошибка компилятора, и довольно вопиющая. - person M.M   schedule 18.11.2015