В моей программе есть строка, которая выглядит примерно так: sprintf (line, "%s [%lu..%lu]", pp->help, min, max);
, где min, max;
- это unsigned long
, а line
- это char[SOME_SIZE]
. Перед вызовом sprintf
я вызываю функцию, которая может назначать отрицания min
, а min получает значение -5
, которое переводится в 4294967291
, потому что оно беззнаковое.
Итак, я попытался сделать что-то вроде:
if((long)min < 0) // works fine because 4294967291 has the binary of 0x1...
sprintf (line, "%s [%d..%d]", pp->help, (long)min, max);
но это не работает. Если верно, но я все равно получаю положительные числа (например, 4294967291
), когда печатаю строку, как я могу это исправить?
ПРИМЕЧАНИЕ. Я не уверен, как реализована печать в конце выполнения, но сейчас сам sprintf
не работает так, как я хочу, так как он добавляет в строку без знака вместо подписанного .
это упрощение моего кода:
unsigned long min = foo() /* in this case -5 */, max = goo() /* in this case 5*/;
char line[100];
if((long)min < 0){
sprintf (line, "%s [%d..%d]", pp->help, (long)min, max);
}// when it prints I get [4294967291..5] instead of [-5..5]
else{
sprintf (line, "%s [%lu..%lu]", pp->help, min, max);
}
РЕДАКТИРОВАТЬ: Я пытался получить аналогичные результаты на моем gcc, но не смог. Но я увидел кое-что очень странное, что могло это объяснить. Когда объявлено line
, это char[]
, но когда отладчик достигает sprintf
, line
идентифицируется как _18 _..., но, к сожалению, я не могу разместить здесь код.
unsigned long
, хотя вам явно нуженsigned long
? 2) Предоставьте минимальный воспроизводимый пример. 3) Похоже на проблему XY (см. 1) 4) Преобразование без знака в знак определяется реализацией. Какое поведение определяет ваша реализация? - person too honest for this site   schedule 27.02.2017%ld
для подписанного вывода. Видеть, что печатается дляmax
(и что должно быть), может помочь в принятии решения. - person TripeHound   schedule 27.02.2017