Низкий и Высокий DWORD => size_t

Язык программирования: C

У меня есть два DWORD: низкий и высокий. Я хочу преобразовать их обоих в одну переменную типа size_t. У меня есть следующий код:

size_t fileSize = fileSizeHigh;
size_t *pfileSize = &fileSize;
pfileSize[4] = fileSizeLow;

так ли это правильно? Наверное, нет, так как первая команда, вероятно, хранит старший байт в неправильной позиции, верно? Пожалуйста, помогите мне, как это сделать. Благодарю вас:)

2 ответа

Итак, в 32-разрядной системе Microsoft DWORD такой же размер, как size_t, Это означает, что вы не можете соответствовать двум DWORDс в пространство, занимаемое size_t,

Ваш код будет просто записывать в память после окончания fileSize и имеет неопределенное поведение. Это не будет делать то, что вы хотите.

Чего вы на самом деле пытаетесь достичь? Какую задачу вы пытаетесь выполнить? Сообщите нам об этом, и мы сможем предложить вам альтернативное решение.

Редактировать: как объясняет @nos, в 64-битной системе size_t может содержать два DWORDs. Если вы используете 64-битную систему, вы можете использовать сдвиг битов для объединения двух:

size_t combined = ((size_t)high << 32) | (size_t)low; // 64-BIT WINDOWS ONLY

Тем не менее, это все еще немного пахнет кодом, потому что операции с 64-битными целями Windows должны быть очень похожи на операции с 32-битными целями, поэтому похоже, что вы что-то делаете по странной причине.

Если вы пишете 64-битный код, size_t обычно 64-битный. Вы должны проверить это на своей платформе. DWORD, как правило, 32-битный, вы должны это проверить. Учитывая 32-битный DWORD и 64-битный size_t, вы делаете это:

DWORD a = ...;
DWORD b = ...;
size_t c = (size_t)a << 32 | b;

Если вы пишете 32-битный код, не имеет смысла объединять 2 32-битных типа в другой 32-битный тип, size_t обычно 32-битный в 32-битном коде.

Другие вопросы по тегам