Усечение константы c++

я получаю это предупреждение

warning C4309: 'initializing' : truncation of constant value

и когда я пытаюсь выполнить свою dll, он отправляет только 4 байта вместо 10 байтов.
Что может быть не так?

вот мой код:

int WINAPI MySend(SOCKET s, const char* buf, int len, int flags)
{

    cout << "[SEND:" << len << "] ";

    for ( int i = 0; i < len; i++ ) {
        printf( "%02x ", static_cast<unsigned char>( buf[i] ) );
    }

    printf("n");

    //causing the warning:
    char storagepkt[] = {0x0A, 0x00, 0x01, 0x40, 0x79, 0xEA, 0x60, 0x1D, 0x6B, 0x3E};

    buf = storagepkt;
    len = sizeof(storagepkt);

    return pSend(s, buf, len, flags);
}

обновление

int (WINAPI *pSend)(SOCKET s, const char* buf, int len, int flags) = send;
int WINAPI MySend(SOCKET s, const char* buf, int len, int flags);

обновление

как было предложено, я попробовал memcpy:

memcpy((char*) buf, storagepkt, sizeof(storagepkt));

обновление

unsigned char storagepkt[] = {0x0A, 0x00, 0x01, 0x40, 0x79, 0xEA, 0x60, 0x1D, 0x6B, 0x3E};

исправил.

3 ответов


вы инициализируете буфер char, который подписан. Ничего более 0x7f выходит, что он может обрабатывать и преобразуется в отрицательное число. Фактические данные, вероятно, в порядке, и вы можете игнорировать предупреждение, хотя было бы лучше сделать это unsigned char.

что касается того, почему он отправляет только 4 байта, это подозрительно похоже на размер указателя. Вы уверены, что код точно такой, как вы его представили, используя массив, а не указатель, переданный функции? Функция не знает размер массива, даже когда вы объявляете параметр как массив - вам нужно передать размер массива в функцию.


Я могу воспроизвести это предупреждение на следующий код:

char aa = 0xff;

предупреждение решается с

unsigned char aa = 0xff;

(Как уже отметил Марк Рэнсом, я просто добавил минимальный пример кода для воспроизведения предупреждения)


Я тоже могу воспроизвести это предупреждение со следующим кодом:

const unsigned short cid = 0xdeadfeeb;

что означает, что значение усекается компилятором, потому что оно находится вне