У меня есть следующий код C:Почему sscanf% lx читает «0» для любого первого uint32_t в 64-битной среде?
uint32_t a = 1, b = 2;
sscanf("0xbadf00d 0xdeadbeef", "%lx %lx", &a, &b);
printf("%lx %lx", a, b);
На 64-битной Linux машины с помощью GCC, если я компилирую с флагом -m32
я получаю правильный выход: badf00d deadbeef
, но по умолчанию я получаю странный вывод 0 deadbeef
,
Что происходит во втором случае? Я использую неправильный символ спецификатора преобразования или, есть ли способ исправить проблему без этого флага компилятора?
Are вы использовали для программирования в Windows? В Windows 'long' - 32 бита. Почти везде «длинный» имеет ту же ширину, что и указатель, поэтому 32 бита в 32-битных системах и 64 бита в 64-битных системах. –
Да; что было источником моей путаницы – Dorj
Я запускаю ubuntu linux 14.04 на amd64 cpu. Без параметра '-m32' компилятор вызывает несколько предупреждений. После исправления всех этих предупреждений код компилируется без проблем и выводит правильные значения. При компиляции всегда включайте все предупреждения, затем устанавливайте эти предупреждения. (для gcc, при минимальном использовании: '-Wall -Wextra -pedantic') – user3629249