Могу ли я привести неподписанный символ * к неподписанному типу 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
Другие вопросы по тегам