2011-12-22 1 views
3

, поэтому я перемещаю char в длинный, затем очищающий и делающий это снова. Сдвиг 15 заставляет мою машину идти дурацкой, см. Комментарий в коде. Как вы думаете, это вызывает это.C бит сдвиг нечетных результатов за последние 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 !!!!! 
+0

вы пробовали копировать полукокс в длинном первый, затем сдвигая его? –

+0

Выглядит отлично «нормально» для меня. Просто взаимодействие различных правил литья C (которые часто непостижимы). –

+0

На какой платформе вы работаете? –

ответ

2

Похоже, вы сдвинув unsigned char слишком далеко, и в результате индуцирующего переполнения. Попробуйте приведение его к longперед тем смещения, например, так:

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

ok тогда сдвиг происходит внутри темпа? В этом есть смысл. – eagletusk

+0

@ user2758: Я не уверен, что это точно сказать, что это происходит _inside_ 'temp'. На самом деле, возможно, вы правы, и мой ответ может быть неправильным. Возможно, вам придется «temp» быть более крупным шрифтом! –

+1

temp повышается до int перед выполнением оператора сдвига. Вероятно, проблема связана с тем, что int подписывается, но я не совсем обернулся вокруг, почему. –

 Смежные вопросы

  • Нет связанных вопросов^_^