У меня есть следующая программа.Почему printf показывает неправильное значение для переменной int для разных настроек компилятора 64 против 32?
int main() {
int a = 1;
long long b = 100000000;
printf("size of a is: %d \t sizeof b is:%d \n",sizeof(a),sizeof(b));
printf("a= %d b=%d a=%d \n", a, b, a);
printf("a= %d b=%Ld a=%d \n", a, b, a);
b = 10000000000;
printf("a= %d b=%d a=%d \n", a, b, a);
printf("a= %d b=%Ld a=%d \n", a, b, a);
}
Когда я скомпилировать его с gcc -m32
выходом
size of a is: 4 sizeof b is:8
a= 1 b=100000000 a=0
a= 1 b=100000000 a=1
a= 1 b=1410065408 a=2
a= 1 b=10000000000 a=1
, но при компиляции с gcc -m64
выходом.
size of a is: 4 sizeof b is:8
a= 1 b=100000000 a=1
a= 1 b=100000000 a=1
a= 1 b=1410065408 a=1
a= 1 b=10000000000 a=1
Почему это показывает неправильные значения во время печати третьего аргумента PRINTF (а)?
Мой GCC версии
[email protected]:~$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper
Target: x86_64-linux-gnu
Неопределенное поведение для вызова printf с идентификатором формата, который не соответствует типу. Таким образом, вывод printf не гарантируется. Если вы неправильно используете% d для печати b, то вывод printfs не определен. Включите предупреждения компилятора и исправьте спецификаторы формата.Тот факт, что он работает на 64-битной основе, - это просто удача от реализации. –
@SectoKia ok, но почему значение 'a' изменяется (от первого аргумента до третьего) в 32-битном компиляторе? – priyanka
@priyanka Я бы не сказал, что значение 'a' изменилось. Случилось так, что printf запутался и не напечатал значение 'a' должным образом. Это запуталось, потому что ты солгал ему. –