12

我收到此警告

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

修复。

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 回答