X86 内部_mm_loadu_si128返回的负值

X86 内部_mm_loadu_si128返回的负值,x86,sse,intrinsics,X86,Sse,Intrinsics,这是我目前的代码: void main() { unsigned char *test = (unsigned char*)malloc(sizeof(unsigned char)* 16); test[0] = 100; test[1] = 128; test[2] = 255; test[3] = 156; test[4] = 190; test[5] = 200; test[6] = 230; test

这是我目前的代码:

void main()
{
    unsigned char *test = (unsigned char*)malloc(sizeof(unsigned char)* 16);        
    test[0] = 100;
    test[1] = 128;
    test[2] = 255;
    test[3] = 156;
    test[4] = 190;
    test[5] = 200;
    test[6] = 230;
    test[7] = 250;
    test[8] = 200;
    test[9] = 100;
    test[10] = 100;
    test[11] = 127;
    test[12] = 150;
    test[13] = 170;
    test[14] = 190;
    test[15] = 200;

    //__m256i sa = _mm256_setzero_si256();
    __m128i sa2 = _mm_setzero_si128();
    sa2 = _mm_loadu_si128((__m128i*)&test[0]);

    for (int i = 0; i < 16; i++)
    {
        printf("%d\n", sa2.m128i_i8[i]);
    }
}
void main()
{
无符号字符*测试=(无符号字符*)malloc(sizeof(无符号字符)*16);
试验[0]=100;
试验[1]=128;
试验[2]=255;
试验[3]=156;
试验[4]=190;
试验[5]=200;
试验[6]=230;
试验[7]=250;
试验[8]=200;
试验[9]=100;
试验[10]=100;
试验[11]=127;
试验[12]=150;
试验[13]=170;
试验[14]=190;
试验[15]=200;
//__m256i sa=_mm256_setzero_si256();
__m128i sa2=_mm_setzero_si128();
sa2=_mm_loadu_si128((_m128i*)和测试[0]);
对于(int i=0;i<16;i++)
{
printf(“%d\n”,sa2.m128i_i8[i]);
}
}
我正在尝试测试一些SSE内在函数。
我使用了
\uuum\u loadu\u si128()
加载类型为
无符号字符
的数组
预期的结果是

{100128,…,190200}

然而,我得到了结果

{100、-128、-1、-100、-66、-56、-26、-6、-56、-86、-66、-56}

最终结果值的二进制值与我预期结果的值相同。
我想知道为什么
\u mm\u loadu\u si128加载负值


请帮帮我

把它们打印成
printf(“%u\n”,(unsigned char)sa2.m128i_i8[i]),怎么样。还让人惊讶的是,你居然能将值300放入一个
无符号字符中
哦!我没有修改代码。。。。我检查了printf(“%u\n”,(无符号字符)sa2.m128i_i8[I])。但数组的实际值并没有改变,不是吗?还应该指出,如果您使用的是MSVC,那么我可能会这样做
printf(“%hhu\n”,sa2.m128i_i8[I])谢谢您的回答!:)但我希望正确的值加载在_m128i sa2。不只是打印正确的值:(是什么让你认为
sa2
的值是错误的?它的值是正确的,你只是不正确地使用了
printf
m128i_i8
是有符号的8位值,
printf
在打印之前将它们提升为有符号整数。另一种方法是使用
m128i_u8
将它们视为无符号的8位值。