Опасно ли продвигать типы в аргументах printf?

Мои вопросы связаны с попыткой использовать printf для регистрации событий при попытке собрать для нескольких платформ с битовой глубиной (например, 32/64).

Проблема, которая продолжает поднимать свою уродливую голову, пытается печатать целые на нескольких архитектурах. На 32 бит это было бы что-то вроде

printf(" my int: %d\n", myInt);

но на 64-битной она должна быть изменена на

print (" my int: %ld\n", (long)myInt);

У меня есть два связанных вопроса:

Сначала я подумал, что когда вы скажете printf напечатать переменную, придав ей формат, он будет смотреть на адрес этой переменной и захватывать столько байтов, сколько необходимо для этого формата. Сначала это казалось большой проблемой. Например, если у вас есть переменная myChar, которая была char (1 байт), но вы использовали спецификатор формата% d, это заставит printf перейти к адресу myChar и захватить следующие 4 байта, чтобы обработать его как int. Если бы это было так, кажется, что printf извлек бы дату мусора из соседних переменных (потому что это захватывало 4 байта, но реальное значение - только 1 байт). Похоже, что это не так. Используя myChar и указав% d, printf захватывает 1 байт, а затем дополняет верхние 3 байта 0 's. Правильно ли мое понимание здесь?

Если вышеприведенное является верным, есть ли реальный вред в том, чтобы всегда приводить переменные до их максимальных значений, чтобы избежать типов проблем, наблюдаемых в 32/64-битном случае. Например, если у вас есть короткая переменная myShort и переменная int, myInt, есть ли недостаток в их печати всегда как:

Е (»myShort% ld "(длинный) myShort); Е (»myInt% ld "(долго) myInt);

Спасибо за любые разъяснения.

Ответы на вопрос(4)

Ваш ответ на вопрос