Определения int, long и т. Д. Относятся к конкретной цели.Если размер int и long совпадают, то
printf("%d",var);
не будут жаловаться, но если long, скажем, 64 бита, а int, например, 32 бита, то вы получите предупреждение / ошибку, которую вы описали.Одно из двух решений:
printf("%ld",var);
or
printf("%d",(int)var);
Для последнего, конечно, вы должны убедиться, что компилятор связывает int с размером% d, если вы получите еще одно предупреждение, то отрегулируйте соответствующим образом.
РЕДАКТИРОВАТЬ:
Компилятор пытается помочь вам, заботясь о вещах библиотеки C, которые на самом деле не бизнес компилятора.printf () использует переменное количество аргументов, которое, как мы надеемся, вы правильно сопоставили со строкой формата.Когда printf видит% d на 32-битной системе, он, вероятно, получит только следующий 32-битный аргумент.Но если вы ввели в качестве параметра 64-битное целое число, оно может захватить половину этого целого числа и использовать другую половину в качестве следующего элемента в строке формата.Например,
unsigned long ul;
float f;
f=3.4;
ul=0x3F9DF3B612345678;
...
printf("%X %f\n",ul,f);
В зависимости от вашей системы, порядкового номера и т. Д., 32-битной системы вы не должны удивляться, если приведенный выше код выдаст такой вывод:
12345678 1.234000
, потому что этоэто то, что вы сказали.вы сказали, что нужно взять младшие 32 бита ul и вывести его как шестнадцатеричный (% X), а верхние 32 бита ul и вывести его как float (% f), а в вызове функции ввести f - пустая трата, которую вы не предоставили.форматирование для использования значения с плавающей запятой.
Теперь, в зависимости от компилятора в целевой системе в конкретный день, приведенный выше код может работать по желанию, возьмите систему / компилятор, где unsigned long интерпретируется как 32бит и% X интерпретируются как 32-битные, тогда вы получите предупреждение о 64-битном назначении, но printf имеет немного больше смысла.
Из-за этой боли компиляторы, такие как gcc, пытаются заставить вашжизнь лучше, если предположить, что когда вы используете функцию с именем printf (), вы используете стандартную C, и они анализируют строку формата в поисках этих типов распространенных ошибок.