12

この警告が表示されます

warning C4309: 'initializing' : truncation of constant value

dll を実行しようとすると、10 バイトではなく 4 バイトしか送信されません。
何が間違っている可能性がありますか?

これが私のコードです:

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};

修正しました。

4

3 に答える 3

22

char署名されているバッファを初期化しています。それを超えるもの0x7fは処理できる範囲を超えており、負の数に変換されます。実際のデータはおそらく問題ないので、警告を無視してもかまいませんが、unsigned char.

4バイトしか送信していない理由については、ポインターのサイズのように疑わしく聞こえます。関数に渡されたポインターではなく、配列を使用して、コードが表現したとおりであると確信していますか? パラメータを配列として宣言しても、関数は配列のサイズを認識しません。配列のサイズを関数に渡す必要があります。

于 2012-12-02T03:40:50.897 に答える
6

次のコードでこの警告を再現できます。

char aa = 0xff;

警告は解決されます

unsigned char aa = 0xff;

(Mark Ransomがすでに指摘しているように、警告を再現するために最小限のサンプルコードを追加しただけです)

于 2014-11-12T16:36:21.823 に答える
0

次のコードでこの警告を再現することもできます。

const unsigned short cid = 0xdeadfeeb;

これは、値が範囲外であるため、コンパイラによって切り捨てられていることを意味しますunsigned short。警告を解決するには、値を減らします。

于 2015-07-22T21:08:22.083 に答える