У меня проблема с тем, как MSVC обрабатывает длинные целые числа без знака. Вот код для воспроизведения:
// test.cpp (note extension)
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
unsigned long long int address = 0x0A0B0C0D0E0F;
printf("Address=%llu\n", address);
printf("%02X:%02X:%02X:%02X:%02X:%02X\n",
((address >> (5 * 8)) & 0xff),
((address >> (4 * 8)) & 0xff),
((address >> (3 * 8)) & 0xff),
((address >> (2 * 8)) & 0xff),
((address >> (1 * 8)) & 0xff),
(address & 0xff));
printf("%02X:", ((address >> (5 * 8)) & 0xff));
printf("%02X:", ((address >> (4 * 8)) & 0xff));
printf("%02X:", ((address >> (3 * 8)) & 0xff));
printf("%02X:", ((address >> (2 * 8)) & 0xff));
printf("%02X:", ((address >> (1 * 8)) & 0xff));
printf("%02X\n", (address & 0xff));
exit(0);
}
Когда я компилирую это в Linux, я получаю (как и ожидалось):
Address=11042563100175
0A:0B:0C:0D:0E:0F
0A:0B:0C:0D:0E:0F
Однако, когда я компилирую это в MSVC ++ 2008 Express, я получаю:
Address=11042563100175
0A:00:0B:00:0C:00
0A:0B:0C:0D:0E:0F
Неправильно ли я отформатировал инструкцию printf? Или MSVC оставляет дополнительный байт в стеке после операций shift и and? Или проблема с чем-то другим?
Примечание: при компиляции с MSVC вам нужно использовать расширение файла .cpp для включения режима C ++. Я полагаю, что это потому, что MSVC в прямом режиме C не включает (все) C99, который включает флаг «% llu» для printf.
Саймон.