Что не так с этим кодом битовой манипуляции из интервью?

Я просматривал эту страницу: http://www.devbistro.com/tech-interview-questions/Cplusplus.jsp и не понял этого вопроса:

Что может быть не так со следующим кодом?

long value;
//some stuff
value &= 0xFFFF;

Примечание. Подсказка кандидату о базовой платформе, для которой он разрабатывается. Если человек все еще не находит ничего плохого в коде, он не имеет опыта работы с C ++.

Может кто-нибудь уточнить это?

Спасибо!

25
задан 30.10.2019, 03:51

3 ответа

Используя MSVC, я думаю, что оператор выполнил бы то, что, скорее всего, предполагалось, то есть: очистить все, кроме наименее значимых 16 битов значения, но я встречал другие платформы, которые интерпретировали бы литерал 0xffff как эквивалентный (short) -1, затем знак расширяется для преобразования в long, и в этом случае выражение «значение & amp; = 0xFFFF» не будет иметь никакого эффекта. «значение & amp; = 0x0FFFF» является более явным и надежным.

-1
ответ дан 30.10.2019, 03:54
  • 1
    Этот тест просто снова использует Z много раз, это не справедливый тест, поскольку у других есть их новое X () и новый Y () в для цикла. Более справедливый должен был бы создать новый X () однажды и выполнить в том же для цикла. Тест немного испорчен. – momomo 18.07.2013, 03:49

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

1
ответ дан 30.10.2019, 03:56
  • 1
    Хорошо, по крайней мере, +1 должен здесь! Спасибо за совместное использование Вашей мысли и теста!!! Я обычно использую статический объект в JS (и часто также на других языках, вместо того, чтобы использовать Singleton) когда я don' t должен инстанцировать больше чем одного экземпляра объекта. Я ожидал, что статический objet будет быстрее, но I' m довольный Вы прояснили здесь с также тестом. Еще раз спасибо! – Marco Demaio 29.10.2010, 00:12
  • 2
    Я признаю ошибку: P – Billy ONeal 30.10.2019, 03:56
  • 3
    @Billy: Это действительно неопределенное поведение для чтения (выполните lvalue-to-rvalue преобразование на), неинициализированная переменная. Это может очень хорошо переформатировать Ваш жесткий диск. См. § 4.1. – GManNickG 30.10.2019, 03:56
  • 4
    @Alf: Да, фактические содержание из переменной не определены. Это НЕ означает, что это неопределенное поведение . Если бы это было неопределенное поведение, то совместимый компилятор мог бы отформатировать Ваш жесткий диск. Принимая во внимание, что в этом случае it' s только позволил помещать мусор в единственную переменную. – Billy ONeal 30.10.2019, 03:57
  • 5
    It' s не неопределенный - содержание могло быть мусором, но этим can' t (Например), форматируют Ваш жесткий диск. – Billy ONeal 30.10.2019, 03:57
  • 6
    @Billy: официально это может сделать носовую вещь демонов. но на практике, в 32-разрядных системах неопределенное значение типа int всего [приблизительно 112] int значение. в 64-разрядной системе, + на некоторой очень архаичной архитектуре, там может проверять и прерывание. аплодисменты, – Cheers and hth. - Alf 30.10.2019, 03:58

Хотя можно утверждать, что, поскольку это не переполнение буфера или какая-либо другая ошибка, которая может быть использована, это вещь в стиле , а не ошибка, я уверен на 99%, что ответ автор вопроса ищет, чтобы value оперировали до того, как ему присвоили. Значение будет произвольным мусором, и вряд ли это будет то, что имелось в виду, так что это «потенциально неправильно».

0
ответ дан 30.10.2019, 03:56

Теги

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