назначить отрицательные значения для char * с помощью sprintf

В моей программе есть строка, которая выглядит примерно так: 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 _..., но, к сожалению, я не могу разместить здесь код.


person CIsForCookies    schedule 27.02.2017    source источник
comment
Отредактируйте свой вопрос и сообщите нам, какой результат вы ожидаете для каких значений.   -  person Jabberwocky    schedule 27.02.2017
comment
1) Есть ли причина, по которой вы используете unsigned long, хотя вам явно нужен signed long? 2) Предоставьте минимальный воспроизводимый пример. 3) Похоже на проблему XY (см. 1) 4) Преобразование без знака в знак определяется реализацией. Какое поведение определяет ваша реализация?   -  person too honest for this site    schedule 27.02.2017
comment
@Olaf 1) Я просто делаю обходной путь, я не хочу менять всю функцию (довольно большая функция) 2) Я редактировал свой q 3) Я редактировал свой q 4) 2) дополнение - это метод, используемый здесь   -  person CIsForCookies    schedule 27.02.2017
comment
Невозможно воспроизвести, нажмите здесь - ›это работает для меня.   -  person Jabberwocky    schedule 27.02.2017
comment
Пожалуйста, отредактируйте именно то, что вы получаете (не то, что не работает) и то, что вы ожидаете (конкретные значения), так как это может помочь понять, что не так. Например, в зависимости от вашего компилятора / платформы вам _могут понадобиться %ld для подписанного вывода. Видеть, что печатается для max (и что должно быть), может помочь в принятии решения.   -  person TripeHound    schedule 27.02.2017
comment
И это также работает для меня.   -  person Jabberwocky    schedule 27.02.2017
comment
"% l" - правильная строка формата для длинного числа со знаком, а не "% d". Может быть, это вызывает проблему   -  person Ingo Leonhardt    schedule 27.02.2017
comment
@IngoLeonhardt Я проверяю это прямо сейчас, но с% ld. есть разница? Я не мог сказать из того, что читал в Интернете   -  person CIsForCookies    schedule 27.02.2017
comment
моя вина,% ld правильно   -  person Ingo Leonhardt    schedule 27.02.2017
comment
Возможный дубликат Каков аргумент для printf, форматирующего долго?   -  person Paul Hankin    schedule 27.02.2017
comment
Нежелание реорганизовать функцию - очень плохая причина использовать приведение! Если это производственный код и у вас есть хороший руководитель проекта, вы столкнетесь с проблемами из-за этого оправдания. А дополнение 2 - это кодировка отрицательных значений, а не метод преобразования!   -  person too honest for this site    schedule 27.02.2017
comment
@Olaf, если это будет моей последней надеждой, то, конечно, я изменю существующий код, но я хочу сделать как можно меньше, чтобы не испортить устаревший код. Теперь я думаю о том, чтобы сначала преобразовать его в строку, настроить ее, а затем добавить к исходной строке   -  person CIsForCookies    schedule 27.02.2017
comment
И что это изменит в проблеме конверсии? При всем уважении, но, похоже, не хватает некоторых основ.   -  person too honest for this site    schedule 27.02.2017