MSVC ++ обрабатывает unsigned long long int - PullRequest
3 голосов
/ 24 марта 2011

У меня проблема с тем, как 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.

Саймон.

1 Ответ

5 голосов
/ 24 марта 2011

Спецификатор формата% X ожидает 32-битный аргумент.Вы передаете 64-битные, выбрасывая из стека.Вы можете использовать% llX.CRT одинаков для кода C и C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...