C位移位奇数的结果是超过15位向左移位



所以我把一个char移到一个long,然后清除,然后再做一次。15的移位使我的机器变得古怪,见代码中的注释。你认为是什么导致了这一切。

本机字符0x00,长0x0000 0000

    unsigned char temp;
    unsigned long open_code;
    temp = 0x01;
    open_code = open_code | (temp <<1);// open_code = 0x0000 0002 
    open_code = 0;
    //......    
    // 2 - 7    
    //....  
    temp = 0x01;
    open_code = open_code | (temp <<8); // open_code = 0x0000 0100 
    open_code = 0;  
    temp = 0x01;
    open_code = open_code | (temp <<9); // open_code = 0x0000 0200 
    open_code = 0;  
    temp = 0x01;
    open_code = open_code | (temp <<10); // open_code = 0x0000 0400 
    open_code = 0;  
    temp = 0x01;
    open_code = open_code | (temp <<11); // open_code = 0x0000 0800 
    open_code = 0;
    temp =  0x01;
    open_code = open_code | (temp <<12); // open_code = 0x0000 1000
    open_code = 0;  
    temp =  0x01;
    open_code = open_code | (temp <<13); // open_code = 0x0000 2000
    open_code = 0;  
    temp =  0x01;
    open_code = open_code | (temp <<14); // open_code = 0x0000 4000  
    open_code = 0;
    temp =  0x01;
    open_code = open_code | (temp <<15); // open_code = 0xFFFF 8000  !!!!!
    open_code = 0;
    temp =  0x01;
    open_code = open_code | (temp <<16); // open_code = 0x0000 0000  !!!!!

看起来您将unsigned char移动得太远,从而导致溢出。尝试在移动之前将其转换为long ,如下所示:

open_code = open_code | (((long)temp) <<15);

最新更新