Количество сдвига отрицательная или слишком большая ошибка - правильное решение?

У меня есть следующая функция для чтения обратного порядка байтов quadword (в абстрактном классе файлового ввода-вывода):

unsigned long long File::readBigEndQuadWord(){
  unsigned long long qT = 0;
  qT |= readb() << 56;
  qT |= readb() << 48;
  qT |= readb() << 40;
  qT |= readb() << 32;
  qT |= readb() << 24;
  qT |= readb() << 16;
  qT |= readb() << 8;
  qT |= readb() << 0;
  return qT;
}

readb () функции читает БАЙТ. Вот используемые определения типов:

typedef unsigned char   BYTE;
typedef unsigned short  WORD;
typedef unsigned long   DWORD;

Вещь состоит в том, что я получаю 4 предупреждения компилятора на первых четырех строках с операцией сдвига:

предупреждение C4293: '<<': сместитесь считают отрицательное или слишком большое, неопределенное поведение

Я понимаю, почему это предупреждение происходит, но я, может казаться, не выясняю, как избавиться от него правильно. Я мог сделать что-то как:

qT |= (unsigned long long)readb() << 56;

Это удаляет предупреждение, но не является там никакой другой проблемой, БАЙТ будет правильно расширен все время? Возможно, я просто думаю об этом слишком много, и решение настолько просто. Можете Вы парни помогать мне здесь?Спасибо.

20
задан PeterK 26 July 2010 в 19:51
поделиться

1 ответ

Ваш способ устранения предупреждения правильный. Как вы, вероятно, уже знаете, предупреждение возникает потому, что вы пытаетесь сдвинуть содержимое байта за границы слова, затем сохранить его в четырехсловном слове. Эта операция не определена. (Она оценит правую часть присваивания, прежде чем присвоить значение). Благодаря явной первой пристановке теперь достаточно места для сдвига, так что жаловаться не на что.

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

Также, я не уверен в этом, но, возможно, компиляция для x64 также не выдаст предупреждение, поскольку одно слово - это 64 бита?

.
16
ответ дан 30 November 2019 в 01:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: