2010-03-15 2 views
3

Я новичок сдвига битов, но я пытаюсь отлаживать следующий фрагмент кода:C++ сдвига битов

if (!(strcmp(arr[i].GetValType(), "f64"))) 
{ 
     dem_content_buff[BytFldPos] = tmp_data; 
    dem_content_buff[BytFldPos + 1] = tmp_data >> 8; 
    dem_content_buff[BytFldPos + 2] = tmp_data >> 16; 
    dem_content_buff[BytFldPos + 3] = tmp_data >> 24; 
    dem_content_buff[BytFldPos + 4] = tmp_data >> 32; 
    dem_content_buff[BytFldPos + 5] = tmp_data >> 40; 
    dem_content_buff[BytFldPos + 6] = tmp_data >> 48; 
    dem_content_buff[BytFldPos + 7] = tmp_data >> 56; 
     }  

Я получаю предупреждение о том, линии с «32» до «56» имеют счет сдвига это слишком велико. «F64» в предикате просто означает, что данные должны быть 64-битными данными.

Как это сделать?

редактировать:.

я должен положить больше кода в

tmp_data = simulated_data[index_data]; 

if (!(strcmp(dems[i].GetValType(), "s32"))) 

{ dem_content_buff [BytFldPos] = tmp_data; dem_content_buff [BytFldPos + 1] = tmp_data >> 8; dem_content_buff [BytFldPos + 2] = tmp_data >> 16; dem_content_buff [BytFldPos + 3] = tmp_data >> 24;
}

, если ((STRCMP (Демс [I] .GetValType(), "F64"))!) { dem_content_buff [BytFldPos] = tmp_data; dem_content_buff [BytFldPos + 1] = tmp_data >> 8; dem_content_buff [BytFldPos + 2] = tmp_data >> 16; dem_content_buff [BytFldPos + 3] = tmp_data >> 24; dem_content_buff [BytFldPos + 4] = tmp_data >> 32; dem_content_buff [BytFldPos + 5] = tmp_data >> 40; dem_content_buff [BytFldPos + 6] = tmp_data >> 48; dem_content_buff [BytFldPos + 7] = tmp_data >> 56; }

Таким образом, dem_content_buff прямо сейчас используется только в тс. Могу ли я использовать этот массив для 64-битных данных?

+3

Какой тип 'tmp_data'? Вероятно, вы захотите, чтобы это был 64-разрядный тип. –

ответ

1

Обязательно используйте 64-битный длинный тип для tmp_data, как было предложено до того, как долгое время неработающее должно работать, но проверьте свою документацию по компилятору и архитектуре.

Код должен выглядеть следующим образом. Кроме того, убедитесь, что ваш demp_content_buff объявлен как unsigned char * или unsigned char [].

Затем измените свой код:

if (!(strcmp(arr[i].GetValType(), "f64"))) 
    { 
     dem_content_buff[BytFldPos] = (tmp_data & 0xff); 
     dem_content_buff[BytFldPos + 1] = (tmp_data >> 8) & 0xff ; 
     dem_content_buff[BytFldPos + 2] = (tmp_data >> 16) & 0xff ; 
     dem_content_buff[BytFldPos + 3] = (tmp_data >> 24) & 0xff; 
     dem_content_buff[BytFldPos + 4] = (tmp_data >> 32) & 0xff; 
     dem_content_buff[BytFldPos + 5] = (tmp_data >> 40) & 0xff; 
     dem_content_buff[BytFldPos + 6] = (tmp_data >> 48) & 0xff; 
     dem_content_buff[BytFldPos + 7] = (tmp_data >> 56) & 0xff; 
     } 
2

Что такое tmp_data?

Я предполагаю, что tmp_data - это всего лишь 32 бита, следовательно, ошибка. Он должен быть 64-битным беззнаковым int, который может быть достигнут с использованием нестандартного (но хорошо поддерживаемого) типа данных unsigned long long.

+0

Этот код не накладывает никаких ограничений на тип 'dem_content_buff'. На самом деле, похоже, что это 8-битный тип. –

+0

tmp_data - это int. – Blade3

+0

@ Карл, хорошо заметив, я неправильно читаю код. –

1

Для оператора сдвига на работу сдвига более чем 32 бита, tmp_data нужно будет иметь тип 64-бит - как несколько других ответов, указанных.

Однако, вы также хотите simulated_data быть массивом некоторого 64-битного типа иначе tmp_data всегда будет равна нулю (или знак-расширенный набор 1 битов) в наиболее значимых битов при назначении его первоначальное значение:

tmp_data = simulated_data[index_data]; 
1

Если вы используете Visual Studio, убедитесь, что вы определяете tmp_data как:

__int64 tmp_data;    // Visual studio version 

вместо

unsigned long long tmp_data; // GCC version 
Смежные вопросы