EDIT (исправления) (я пропустил точку. Мой ответ является правильным для констант, но вопрос содержит параметры функций, то, что здесь происходит переполнение подписанных целых объектов и, как правильно указало @Cornstalks в его комментарий, это неопределенное поведение). /EDIT
В fun1()
вы используете printf()
в неправильном направлении.
Вы написали "%d"
, чтобы принять int
, но это неправда, если ваш номер больше, чем MAX_INT
.
В вашей системе необходимо проверить значение MAX_INT
.
Если вы пишете целую постоянный в шестнадцатеричном формате, стандарт C (ISO C99 или C11) пытается поставить значение в первом типе, что константа может соответствовать, следуя порядку:
Int , unsigned int, long int, unsigned long int, long long int, unsigned long long int.
Таким образом, если у вас есть постоянная больше, что MAX_INT
(макс. Значение в диапазоне int
), ваш постоянный (если положительный) имеет тип unsigned int
, но директива %d
ожидается значение signed int
. Таким образом, будет показано некоторое отрицательное число.
Худший, если ваша постоянная величина больше UMAX_INT
(макс.значение в диапазоне unsigned int
), тогда тип константы будет первым из long int, unsigned long int, long long int
, с точностью, строго превышающей unsigned int
.
Это означает, что %d
становится неправильной директивой.
Если вы не можете быть полностью уверены, насколько велики будут ваши ценности, вы могли бы сделать бросок к самому большому целочисленному типу:
printf("%lld", (long long int) 0x33333333333);
директива %lld
обозначает long long int
.
Если вы заинтересованы всегда положительные значения, вы должны использовать %llu
и приведение к unsigned long long int
:
printf("%llu", (unsigned long long int) 0x33333333333);
Таким образом, вы избежать каких-либо «смешные» номера, так же, как вы показать большие цифры без потери любой точности.
Примечание: константы INT_MAX
, UINT_MAX
и тому подобное, в limits.h.
Важно: Автоматическая последовательность слепок действительна только для восьмеричных и шестнадцатеричных констант. Для десятичных констант существует другое правило:
int, long int, long long int.
Делитесь неожиданными значениями, которые вы видите, а также значениями, которые вы ожидаете? –
Подписанное целочисленное переполнение - это неопределенное поведение, но, скорее всего, вы видите сплошное переполнение целых чисел [2-го дополнения] (http://en.wikipedia.org/wiki/Two's_complement). – Cornstalks
Не уверен, как коррупция в стеке играет в это. Кажется, что в этой программе нет никакого повреждения стека. Кроме того, неясно, каков ваш вопрос. –