Низкий и Высокий 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
может содержать два DWORD
s. Если вы используете 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-битном коде.