Могу ли я привести неподписанный символ * к неподписанному типу int*?
error: invalid static_cast from type ‘unsigned char*’ to type ‘uint32_t* {aka unsigned int*}’
uint32_t *starti = static_cast<uint32_t*>(&memory[164]);
Я выделил массив символов и хочу прочитать 4 байта как 32-битное целое, но я получаю ошибку компилятора. Я знаю, что могу немного сдвинуть, вот так:
(start[0] << 24) + (start[1] << 16) + (start[2] << 8) + start[3];
И это будет делать то же самое, но это много дополнительной работы.
Можно ли как-то просто отбросить эти четыре байта как int?
4 ответа
static_cast
предназначен для использования для "хороших" бросков, таких как double -> int
, Вы должны использовать reinterpret_cast
:
uint32_t *starti = reinterpret_cast<uint32_t*>(&memory[164]);
Или, если вы готовы, C-style бросает:
uint32_t *starti = (uint32_t*)&memory[164];
Да, вы можете конвертировать unsigned char*
значение указателя на uint32_t*
(с использованием броска в стиле C или reinterpret_cast
) - но это не значит, что вы обязательно можете использовать результат.
Результат такого преобразования может не указывать на адрес, правильно выровненный для хранения uint32_t
объект. Например, unsigned char*
может указывать на нечетный адрес; если uint32_t
требует даже выравнивания, при попытке разыменования результата вы будете иметь неопределенное поведение.
Если вы можете гарантировать, что unsigned char*
указывает на правильно выровненный адрес, вы должны быть в порядке.
Ты можешь использовать reinterpret_cast
как предложено Фаранватом, но, пожалуйста, поймите, что рискуете пойти по этому пути
Значение того, что вы получите, будет радикально отличаться в системе с прямым порядком байтов от системы с прямым порядком байтов. Ваш метод будет работать в обоих случаях.
Я привык к BDS2006 C++, но в любом случае это должно работать и на других компиляторах
char memory[164];
int *p0,*p1,*p2;
p0=((int*)((void*)(memory))); // p0 starts from start
p1=((int*)((void*)(memory+64))); // p1 starts from 64th char
p2=((int*)((void*)(&memory[64]))); // p2 starts from 64th char