Усечение константы 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;
что означает, что значение усекается компилятором, потому что оно находится вне