blj28

导航

数据移位组合高位始终为0——C语言数据类型转换避坑

1、问题由来:

两个char类型数据高低位组合为两字节数据,数据高位一直没有值(Linux 系统下正常windows下异常)

2、问题描述:

        uint16_t data_in[256] = {0};
        short test = 399;//0x18F
        char ptr[2] = {0};
        memcpy(ptr,&test,2);
        printf("ptr=%d %d \n",ptr[0],ptr[1]);
        uint16_t test2= ptr[0] + (((uint16_t)ptr[1])<<8);
        uint16_t test3= (uint8_t)ptr[0];
        uint16_t test4= ptr[1];
        printf("test2 =%d  %d %d \n",test2,test3,test4);

 

打印上述结果:

3、解决方案:

uint16_t test2= ptr[0] + (((uint16_t)ptr[1])<<8); 由于ptr[0] 打印为-113,高位基本上全为FF,所以再在高位加1 ,数值不会改变;
 char ptr[2] = {0};改成uint8_t即可,后面数据以及前面代码均改变;
        uint16_t data_in[256] = {0};
        uint16_t test = 399;//0x18F
        uint8_t ptr[2] = {0};
        memcpy(ptr,&test,2);
        printf("ptr=%d %d \n",ptr[0],ptr[1]);
        uint16_t test2= ptr[0] + (ptr[1]<<8);
        uint16_t test3= (uint8_t)ptr[0];
        uint16_t test4= ptr[1];
        printf("test2 =%d  %d %d \n",test2,test3,test4);

 

 

posted on 2025-05-06 19:46  bailinjun  阅读(22)  评论(0)    收藏  举报